我见过几次拳击、开箱和打字擦除这几个术语。我正在阅读Scala谜题书(Puzzler 22,and ),发现了一些让我困惑的语句。例如:
Scala集合与Java集合(数组除外)一样,不能直接存储Java原语类型。由于集合是泛型的,并且泛型类受类型擦除的限制,集合元素的类型被删除为AnyRef (java.lang.Object)。Scala的所有值类型(包括Int )都是AnyVals,因此当存储在集合中时,需要将其装箱到AnyRef包装器类型中。因此,每个Scala MapString,Int实际上都在封面下包含整数值。因此,从MapString中读取Integer值是编译器一直在做的事情。
问题1-上述语句是否意味着Map[Int, String]实际上是Map[Integer, String]
问题2-为什么数组在存储Java原语的能力上是不同的?
问题3-类型擦除是否影响拳击和取消拳击?
发布于 2017-11-13 21:06:03
问题1.在这两种意义上都没有。它在编译时是Map[Int, String],但在运行时只是Map。这个运行时Map中的键是Integer的.除非你的程序在某种程度上“作弊”。
问题2.因为JVM类型系统在泛型存在之前就对数组进行了专门的处理,并且很久以前就这样做了。引号没有提到这一点,但是Array[File]和Array[String]在运行时也是不同的类型(与List和所有其他集合不同)。
问题3.它们发生在相同的编译阶段(正如您在https://typelevel.org/scala/docs/phases.html上看到的那样),它们当然是相互作用的。
https://stackoverflow.com/questions/47272926
复制相似问题