来自Java Land我一直在努力自学Scala。最近我玩弄了Int
数据类型,我决定查找Int类here的API。
令我困惑的是Int
的类定义,即abstract final
。
如果我在提出这个问题之前没有读过Scala中abstract
和final
的含义,我很抱歉,但我很好奇,所以我马上输了这篇文章。
所以我想要了解的是:
Scala中abstract
,final
和extends
的语义是否有所不同?
同样,我的理解是,在Java中,不能同时拥有abstract
和final
。
那么我该如何解释final abstract class Int private extends AnyVal
?
答案 0 :(得分:29)
正如评论中指出的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
)。