[英]Type mismatch generics with classOf Scala
我有一种方法可以根据配置标志format
将字段成员动态转换为特定类型。
此标志format
接受以下类型值之一:
object Types {
val Str = "string"
val IntNum1 = "int"
val IntNum2 = "integer"
val DoubleNum = "double"
val LongNum = "long"
}
一种选择是使用反射。 另一种选择是使用模式匹配(我正在尝试使用的方法)
下面是String
类型的方法:
private def getValClassIfStr(format: String): Class[String] = {
format.toLowerCase match {
case Types.Str => classOf[String]
case _ => null
}
}
这是从AnyVal
扩展的数字类型的方法,它无法编译:
private def getValueClass[T <: AnyVal](format: String): Try[Class[T]] = {
format.toLowerCase match {
case Types.IntNum1 || Types.IntNum2 => Success(classOf[Int])
case Types.DoubleNum => Success(classOf[Double])
case Types.LongNum => Success(classOf[Long])
case _ => Failure(new Exception)
}
}
由于以下原因,第二种方法无法编译: Type mismatch: required Try[Class[T]] found Try[Class[Int]]
我不明白,给定T <: AnyVal
。
任何的想法? 如果这是一个糟糕的方法,那么“干净”的替代方案是什么?
我认为一旦你用Class[AnyVal]
替换返回值中的Class[T]
,为什么这不起作用的原因变得更加清晰:
type mismatch;
found : Class[Int](classOf[scala.Int])
required: Class[AnyVal]
Note: Int <: AnyVal, but Java-defined class Class is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: AnyVal`. (SLS 3.2.10)
换句话说,任何对getValueClass[T]
调用总是必须由编译T = AnyVal
填充,因为format
只在运行时进行评估。 但是,这是不可能的,因为Class[T]
是不变的,因此您不能将Class[Int]
和Class[Double]
作为Class[AnyVal]
,因为对于不变容器,没有子类型关系。
展示:
var x: Class[AnyVal] = _
x = classOf[Int]
// Boom
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.