我刚刚开始调查Scala并在Wikipedia page on Scala中找到以下令人困惑的引用:
[Scala]清理Java中糟糕的设计决策(例如类型擦除......
我认为类型擦除是Java虚拟机强加的限制,所以假设JVM执行Scala代码,它是如何“清理”的?
我很欣赏Scala的设计者也为JVM做出了贡献,所以我很想知道他/ Scala团队是否已经扩充了Scala编译器以提供丰富的运行时类型信息,从而“清理”类型擦除。是这种情况吗?
提前感谢您提供的任何见解。
答案 0 :(得分:4)
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])
答案 1 :(得分:1)
嗯,引用说“清理”,而不是“消除”。类型擦除仍然存在,它可以咬你。
Scala有Manifest
个。 Manifest
是一个对象,其中包含有关您的实际类型的信息。 Here is a nice answer关于Manifest
s。