gpt4 book ai didi

java - 编译时类型和运行时类型之间存在差异的原因是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:55 24 4
gpt4 key购买 nike

在 Scala/Java(~ 在 JVM 上)中,有一些行为不同的较小情况,例如:

/* "Dynamic" cast */
"".getClass.cast("Foo")
//res0: Any = Foo

/* "Static" cast */
classOf[String].cast("Foo")
//res1: String = Foo

/* "Compile time cast" */
"Foo".asInstanceOf[String]
res2: String = Foo

在哪些语言中,编译时间和运行时间之间的差距更大?从语言设计的 POV 角度来看,这可能是一件“好事”吗?

转向另一个方向:是否存在编译时和运行时类型之间没有任何差异的(静态类型)语言?

最佳答案

第一个结果的原因是 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] (斯卡拉)。换句话说,这样的扩展不会带来任何更强的表达能力,但会使语言的实现复杂化。

至于“编译时转换”与“'静态'转换”,确实没有区别。编译器将 x.asInstanceOf[T] 脱糖为 classOf[T].cast(x) 是正确的。

任何具有子类型的语言都有可能引用的静态已知类型不如它所引用的值的类型具体。具有没有子类型的静态类型系统的语言通常没有运行时类型的概念,因为只有一种实际类型存在于给定的类型名称中。在这些语言中,类型在运行时被删除,这与 JVM 上类型参数的删除方式非常相似。

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

关于java - 编译时类型和运行时类型之间存在差异的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4803235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com