我遇到过几次装箱,拆箱和类型擦除等术语。我正在阅读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 - 类型擦除是否会影响装箱和拆箱?
答案 0 :(得分:0)
问题1.两种意义都没有。它在编译时是Map[Int, String]
,但在运行时只是Map
。此运行时Map
中的键是Integer
...除非您的程序"作弊"以某种方式。
问题2.因为JVM类型系统特别处理数组,并且在泛型存在之前就已经存在了很久。引用没有提到这一点,但Array[File]
和Array[String]
在运行时也是不同的类型(与List
和所有其他集合相对)。
问题3.它们发生在同一个编译阶段(正如你在https://typelevel.org/scala/docs/phases.html看到的那样),它们肯定会互动。