bug*_*oot 1 types scala runtime class subclass
我想创建一个函数,该函数使用来返回具有相同超类的Scala子类的运行时表示形式classOf,例如
class C
class C0 extends C
class C1 extends C
def f(i: Int): Class[C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
Run Code Online (Sandbox Code Playgroud)
但是,的返回值classOf[Cn]给我错误类型为classOf [Cn]的Expression并不能确认为期望的类型Class [C],给我的印象是继承信息丢失了Class[T]。
我认为ClassTag可以以某种方式帮助保留增加的类型,但是如何呢?
Class[A]在中是不变的A。意思Class[C1]是,虽然不是的子类型,Class[C]但C1不是的子类型C。
您可以将返回类型重写为存在性类型,Class[_ <: C]以表明您知道其类型参数将是的子类型,C但是您不知道哪个。
def f(i: Int): Class[_ <: C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
Run Code Online (Sandbox Code Playgroud)
我怀疑(但现在不是100%肯定)Class协变Class是有意义的,但是它是在Java中定义的,其中所有通用类(特殊数组除外)都是不变的。