java中编译时类型是什么意思_java – 编译时类型和运行时类型之间存在差异的原因是什么?...

第一个结果的原因是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上擦除类型参数的方式非常相似.

我希望这与运行时类型的值相比,有助于理解静态类型的引用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值