scala - 试图理解“最终抽象类 Int private extends AnyVal in Scala

标签 scala

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

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

如果我没有读懂 abstract 的意思,我很抱歉和 final在问这个问题之前在 Scala 中,但我很好奇,所以我马上打出了这篇文章。

所以我想理解的是:
abstract 的语义吗? , finalextends Scala 中的不同?
同样,据我所知,在 Java 中,不能有 abstractfinal同时。
那么我该如何解释 final abstract class 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 - 试图理解“最终抽象类 Int private extends AnyVal in Scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12289973/

相关文章:

scala - 如何将 Spark Dataframe 列转换为字符串数组的单列

mysql - 带有 Hikari 设置的 Doobie

xml - 如何确定节点是否有子节点

scala - 如何从 Akka actor 本身中获取该 actor 的名称?

mongodb - MongoDb中的偶发(身份验证?)失败和到期

scala - 如何检查scala中的返回值类型

scala - 如何自动生成一个函数以将密封的案例类系列与隐式实例相匹配?

scala - 从其他子项目触发 SBT 程序集

java - 替换 ![CDATA[xxx]] 中所有匹配 [.*] 的内容,而不替换 CDATA

scala - Spark 驱动程序不会因异常而崩溃