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

Common type of Scala subclasses' runtime representation

我想创建一个函数,该函数 return 使用 classOf 具有相同超类的 Scala 子类的运行时表示,例如

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]
}

然而,classOf[Cn] 的 return 值给我错误 Expression of type classOf[Cn] doesn't confirm to the expected type Class[ C],给我的印象是继承信息在Class[T]中丢失了。

我认为 ClassTags 可以以某种方式帮助保留擦除类型,但如何?

Class[A]A 中不变。这意味着 Class[C1] 而不是 Class[C] 的子类型,即使 C1C.

的子类型

您可以将 return 类型重写为存在类型 Class[_ <: C] 以表明您知道其类型参数将是 C 的子类型,但您不知道是哪个一.

def f(i: Int): Class[_ <: C] = {
  if (i % 2 == 0) classOf[C0]
  else classOf[C1]
}

我怀疑(但现在不是 100% 确定)Class 协变是有意义的,但是 Class 是在 Java 中定义的,其中 所有泛型类(特殊数组除外)都是不变的。