我刚刚开始研究 Scala,并在 Wikipedia page on Scala 中发现了以下令人费解的引用:
[Scala] cleans up [...] poor design decisions in Java (e.g. type erasure...
我认为类型删除是 Java 虚拟机强加的限制,所以假设 JVM 执行 Scala 代码,这是如何“清理”的?
我非常感谢 Scala 的设计者也为 JVM 做出了贡献,所以我很想知道他/Scala 团队是否增强了 Scala 编译器以携带丰富的运行时类型信息,从而“清理”类型删除.是这样吗?
提前感谢您提供的任何见解。
最佳答案
遗憾的是,Scala 仍然需要在 JVM 运行时处理类型删除。然而,关于泛型的一些事情已经被清理干净:
- 类型参数是非可选的(没有
List
,只有List<String>
/List[String]
) - 协变/逆变的语言支持
进一步,应对JVM的局限性 TypeTags
(在 2.9 Manifests
中)可用于存储类型信息,否则这些信息将在运行时丢失。例如:
import scala.reflect.runtime.universe._
def foo[T : TypeTag](x: List[T]) = {
println(implicitly[TypeTag[T]].tpe)
}
这会打印列表元素的类型。如果 - 例如 - 你传递了一个空列表,那么将无法恢复的东西:
foo(List.empty[String])
// not distinguishable without TypeTags from
foo(List.empty[Int])
关于Scala 的 "clean up"类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16973378/