Scala子类的常见类型的运行时表示形式

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可以以某种方式帮助保留增加的类型,但是如何呢?

Jas*_*r-M 5

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中定义的,其中所有通用类(特殊数组除外)都是不变的。