首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拳击、开箱和类型擦除

拳击、开箱和类型擦除
EN

Stack Overflow用户
提问于 2017-11-13 20:23:38
回答 1查看 326关注 0票数 1

我见过几次拳击、开箱和打字擦除这几个术语。我正在阅读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-类型擦除是否影响拳击和取消拳击?

EN

回答 1

Stack Overflow用户

发布于 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上看到的那样),它们当然是相互作用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47272926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档