来自 Java Land,我一直在尝试自学 Scala。最近我正在研究 Int 数据类型,我决定查找 Int 类的 API here .
让我困惑的是Int
的类定义,它是abstract final
。
如果我在问这个问题之前没有阅读 Scala 中 abstract
和 final
的含义,我很抱歉,但我很好奇,所以我立即写了这篇文章。
所以我想理解的是:
Scala 中 abstract
、final
和 extends
的语义是否不同?
再次强调,据我所知,在 Java 中,不能同时拥有 abstract
和 final
。
那么我该如何解释final抽象类Int private extends AnyVal
?
最佳答案
正如 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 给出。
关于scala - 试图理解“Scala 中的最终抽象类 Int private 扩展 AnyVal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080534/