28

来自 Java Land,我一直在尝试自学 Scala。最近我在玩数据类型,我决定在这里Int查找 Int 类的 API 。

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

如果我在问这个问题之前没有阅读 Scala 的含义,我很抱歉abstractfinal但我很好奇,所以我马上打了这个帖子。

所以我想了解的是:Scala 中的语义和abstract不同吗?同样,据我所知,在 Java 中,不能同时拥有和。那么我该如何解释呢?finalextendsabstractfinalfinal abstract class Int private extends AnyVal

4

1 回答 1

31

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

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

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

Tour of Scala: Unified Types提供了更多关于统一类型系统的信息

于 2012-09-05T21:49:44.910 回答