Scala""清理"类型擦除

时间:2013-06-06 22:36:50

标签: scala compilation jvm type-erasure

我刚刚开始调查Scala并在Wikipedia page on Scala中找到以下令人困惑的引用:

  

[Scala]清理Java中糟糕的设计决策(例如类型擦除......

我认为类型擦除是Java虚拟机强加的限制,所以假设JVM执行Scala代码,它是如何“清理”的?

我很欣赏Scala的设计者也为JVM做出了贡献,所以我很想知道他/ Scala团队是否已经扩充了Scala编译器以提供丰富的运行时类型信息,从而“清理”类型擦除。是这种情况吗?

提前感谢您提供的任何见解。

2 个答案:

答案 0 :(得分:4)

遗憾的是,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])

答案 1 :(得分:1)

嗯,引用说“清理”,而不是“消除”。类型擦除仍然存在,它可以咬你。

Scala有Manifest个。 Manifest是一个对象,其中包含有关您的实际类型的信息。 Here is a nice answer关于Manifest s。