Scala函数使用Case Class时出现全路径类名类型不匹配错误
我定义了Case Class S3FileRecords:
case class S3FileRecords( rank: Integer, name: String, )
在实现LocalFileReader类的read方法时,传入该Case Class名称后出现类型不匹配错误:系统要求List[S3FileRecords],但实际得到List[user.path.s3FileEvent.S3FileRecords](user.path.s3FileEvent为该Case Class的包路径)。
相关代码如下:
class LocalFileReader extends FileHandler { def read[S3FileRecords](rootDir: String, fileName: String): (List[String], List[S3FileRecords]) = { // 拼接文件完整路径 val file = new File(rootDir, fileName) // 读取文件内容 val fileContent = new FileInputStream(file); // 解压GZIP格式内容 val zipFileContent = new GZIPInputStream(fileContent) // 转换为JSON字符串 val jsonfileContent = Source.fromInputStream(zipFileContent).mkString // 反序列化JSON内容 val (err, ok) = jsonfileContent .split("\n") .map(decodeWithError) .partitionMap(identity) (err.toList, ok.toList) } def decodeWithError(str: String): Either[String, S3FileRecords] = { decode[S3FileRecords](str) match { case Right(value) => Right(value) case Left(ParsingFailure(message, _)) => Left(s"解析字符串出错; 错误信息: $message; 原始字符串: $str") case Left(DecodingFailure(message, ops)) => { val failedCursor = str.asJson.hcursor.replay(ops).focus.toString Left(s"解码为${classOf[S3FileRecords].toString}出错;" + s" 错误信息: $message, 失败游标: $failedCursor; 原始记录: $str") } } } }
错误提示:
Type mismatch. Required: scala.collection.immutable.List[S3FileRecords], found: scala.collection.immutable.List[user.path.s3FileEvent.S3FileRecords]
解决方案
问题根源在read方法的泛型定义上:你在方法签名里写的[S3FileRecords]是一个泛型参数占位符,它会遮蔽你实际定义的user.path.s3FileEvent.S3FileRecords Case Class。此时方法返回类型里的S3FileRecords指的是这个泛型参数,而非你写的具体Case Class,因此出现类型不匹配。
直接删除方法签名中的泛型参数即可,修改后的read方法签名如下:
def read(rootDir: String, fileName: String): (List[String], List[S3FileRecords]) = { // 原有逻辑保持不变 }
如果需要让read方法支持泛型解析,需给泛型参数添加类型约束(比如要求实现Decoder),并同步修改decodeWithError方法适配泛型,但从当前代码逻辑看,你不需要泛型能力,直接使用具体的S3FileRecords类型就能解决问题。
内容的提问来源于stack exchange,提问作者Sakshi Trivedi

