scala match类[X]仅适用于外部类定义的类

时间:2017-11-22 06:55:41

标签: scala

我正在使用scala将不同的java类型转换为Spark DataType,所以我编写了以下方法:

def convertDataType(x : Class[_]): DataType = {
x match {
  case i: Class[Integer] => IntegerType
  case s: Class[String] => StringType
  case d: Class[Double] => DoubleType
  case l: Class[Long] => LongType
  case s: Class[Short] => ShortType
  case b: Class[Byte] => ByteType
  case f: Class[Float] => FloatType
  case ab: Class[Array[Byte]] => BinaryType
  case bl: Class[Boolean] => BooleanType
  case ts: Class[Timestamp] => TimestampType
  case dt: Class[Date] => DateType
  case _ => StringType
}}

但是,使用输入x(java.lang.String)时,它会突然出现IntegerType。 我尝试了另一种方式:

def convertDataType(x : Class[_]): DataType = {
val S = classOf[String]
val I = classOf[Integer]
val D = classOf[Double]
val L = classOf[Long]
val SH = classOf[Short]
val B = classOf[Byte]
val F = classOf[Float]
val AB = classOf[Array[Byte]]
val BL = classOf[Boolean]
val TS = classOf[Timestamp]
val DT = classOf[Date]

x match {
  case I => IntegerType
  case S => StringType
  case D => DoubleType
  case L => LongType
  case SH => ShortType
  case B => ByteType
  case F => FloatType
  case AB => BinaryType
  case BL => BooleanType
  case TS => TimestampType
  case DT => DateType
  case _ => StringType
}}

第二种方法效果很好,并按预期返回StringType。 我不知道第一次实施中有什么问题?

非常感谢。

1 个答案:

答案 0 :(得分:1)

匹配: Class[Double]与匹配: Class[_]完全相同,因为泛型类型参数不可用。  编译器实际应该警告你:

 warning: non variable type-argument Double in type pattern java.lang.Class[Double] is unchecked since it is eliminated by erasure

Array以外的任何其他泛型类型也会发生这种情况。有很多关于此问题的Stack Overflow问题和文章,搜索“类型擦除”。

在第二种情况下,您正在做一些完全不同的事情:比较值而不是检查类型。这不会遇到上述问题。