Scala 的 "clean up"类型删除

标签 scala compilation jvm type-erasure

我刚刚开始研究 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/

相关文章:

java - 为什么从 Java 12 开始 JVM 启动速度更快

scala - 字符串模式匹配最佳实践

c - 是否可以更改 x64 的 gcc 中的调用约定?

java - 如何用 Java 编译 .java 文件?

java - 如何找出编译时加载了哪个类?

java - 支持JVM的平台

java - Orika 类 com.sun.proxy 无法访问

scala - 读取输入文本文件列表,其中各个文件名包含逗号

scala - 下划线 "class needs to be abstract since method is not defined"错误

java - java开发的最佳操作系统?