试图理解“最终的抽象类Int private在Scala中扩展AnyVal

时间:2012-09-05 21:19:35

标签: scala

来自Java Land我一直在努力自学Scala。最近我玩弄了Int数据类型,我决定查找Int类here的API。

令我困惑的是Int的类定义,即abstract final

如果我在提出这个问题之前没有读过Scala中abstractfinal的含义,我很抱歉,但我很好奇,所以我马上输了这篇文章。

所以我想要了解的是: Scala中abstractfinalextends的语义是否有所不同? 同样,我的理解是,在Java中,不能同时拥有abstractfinal。 那么我该如何解释final abstract class Int private extends AnyVal

1 个答案:

答案 0 :(得分:29)

正如评论中指出的om-nom-nom,abstract禁止实例化(new Int),而final禁止继承(new Int { ... })。

原因是scala.Int直接由Java虚拟机的原始整数类型表示;其他类似的类型包括ByteShortCharLongFloatDoubleBoolean因为它们是运行时的原始类型(表现出比所谓的盒装类型更好的性能)并且JVM不允许添加新的原语,所以没有合法的方法来扩展这些类型。除了给出文字(val i: Int = 33)之外,没有办法实例化它们。

Scala具有这些类型来创建统一的对象系统,其中基本类型和“对象”之间没有逻辑差异。然而,顶部有一个分层区别,AnyRef(对应java.lang.Object)和AnyVal(对应于那些原始类型;并添加Scala的新类型Unit)。

Tour of Scala: Unified Types

给出了有关统一类型系统的更多信息