第一个结果的原因是getClass方法在Java中具有以下签名
public final Class> getClass()
Scala继承了哪些.虽然我们知道如果我们在类型T的引用上调用getClass,签名就可以了
public final Class extends T> getClass()
编译器没有.您可以想象一些语言扩展,以提供一种特殊类型,表示将启用的接收器的静态类型
public final Class extends Receiver> getClass()
或getClass编译器中的某种特殊大小写.事实上,Snoracle Java确实是特殊情况getClass,但我不确定Java语言规范是否需要它.但是,如果您有一些特定静态类型T的引用,则没有理由不能执行等效的T.class(java)或classOf [T](scala).换句话说,这样的扩展不会带来更大的表达能力,但会使语言的实现复杂化.
至于“编译时间演员”与“静态’演员阵容”,那里真的没什么区别.对于编译器来说,将x.asInstanceOf [T]去掉到classOf [T] .cast(x)是正确的.
任何具有子类型的语言都有可能静态已知类型的引用不如它所引用的值的类型具体.具有静态类型系统但没有子类型的语言通常没有运行时类型的概念,因为只有一个实际类型存在于给定类型名称中.在这些语言中,类型在运行时被擦除,这与在JVM上擦除类型参数的方式非常相似.
我希望这与运行时类型的值相比,有助于理解静态类型的引用.