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]
中丢失了。
我认为 ClassTag
s 可以以某种方式帮助保留擦除类型,但如何?
Class[A]
在 A
中不变。这意味着 Class[C1]
是 而不是 Class[C]
的子类型,即使 C1
是 C
.
的子类型
您可以将 return 类型重写为存在类型 Class[_ <: C]
以表明您知道其类型参数将是 C
的子类型,但您不知道是哪个一.
def f(i: Int): Class[_ <: C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
我怀疑(但现在不是 100% 确定)Class
协变是有意义的,但是 Class
是在 Java 中定义的,其中 所有泛型类(特殊数组除外)都是不变的。
我想创建一个函数,该函数 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]
中丢失了。
我认为 ClassTag
s 可以以某种方式帮助保留擦除类型,但如何?
Class[A]
在 A
中不变。这意味着 Class[C1]
是 而不是 Class[C]
的子类型,即使 C1
是 C
.
您可以将 return 类型重写为存在类型 Class[_ <: C]
以表明您知道其类型参数将是 C
的子类型,但您不知道是哪个一.
def f(i: Int): Class[_ <: C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
我怀疑(但现在不是 100% 确定)Class
协变是有意义的,但是 Class
是在 Java 中定义的,其中 所有泛型类(特殊数组除外)都是不变的。