scala - Scala 子类的运行时表示的常见类型
问题描述
我想创建一个函数,该函数返回具有相同超类的 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]
}
但是,返回值classOf[Cn]
给我的错误Expression of type of classOf[Cn] 与预期的类型 Class[C] 不相符,给我的印象是继承信息丢失在Class[T]
.
我认为ClassTag
s 可以以某种方式帮助保留已删除的类型,但是如何?
解决方案
Class[A]
在 中是不变的A
。意思是 that不是Class[C1]
的子类型,即使是 的子类型。Class[C]
C1
C
您可以将返回类型重写为存在类型Class[_ <: C]
,以表明您知道其类型参数将是的子类型,C
但您不知道是哪一个。
def f(i: Int): Class[_ <: C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
我怀疑(但现在还不是 100% 确定)协变是有意义的Class
,但是Class
在 Java 中定义的所有泛型类(除了特殊的数组)都是不变的。