拳击,拆箱和类型擦除

时间:2017-11-13 20:23:39

标签: scala

我遇到过几次装箱拆箱类型擦除等术语。我正在阅读Scala益智游戏(Puzzler 22,Cast Away),并发现了一些令我困惑的陈述。例如:

  

Scala集合(如Java集合(数组除外))无法直接存储Java基元类型。由于集合是通用的,并且泛型类受类型擦除的影响,因此集合元素的类型将被删除为AnyRef(java.lang.Object)。所有Scala的值类型(包括Int)都是AnyVals,因此在存储在集合中时需要将其装入AnyRef包装类型中。所以每个Scala Map [String,Int]实际上都包含整数值。因此,从Map [String,Int]中读取整数值是编译器一直在做的事情。

问题1 - 上述陈述是否意味着Map[Int, String]实际上是Map[Integer, String]

问题2 - 为什么数组在存储Java原语方面存在差异?

问题3 - 类型擦除是否会影响装箱和拆箱?

1 个答案:

答案 0 :(得分:0)

问题1.两种意义都没有。它在编译时是Map[Int, String],但在运行时只是Map。此运行时Map中的键是Integer ...除非您的程序"作弊"以某种方式。

问题2.因为JVM类型系统特别处理数组,并且在泛型存在之前就已经存在了很久。引用没有提到这一点,但Array[File]Array[String]在运行时也是不同的类型(与List和所有其他集合相对)。

问题3.它们发生在同一个编译阶段(正如你在https://typelevel.org/scala/docs/phases.html看到的那样),它们肯定会互动。