首页 > 解决方案 > 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].

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

标签: scalaclasstypesruntimesubclass

解决方案


Class[A]在 中是不变的A。意思是 that不是Class[C1]的子类型,即使是 的子类型。Class[C]C1C

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

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

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


推荐阅读