[英]Is is reasonable, and is there a benefit to a Scala Symbol class that extends AnyVal?
[英]trying to understand "final abstract class Int private extends AnyVal in Scala
來自 Java Land 我一直在嘗試自學 Scala。 最近我與玩弄Int
數據類型,我決定以查找API為int類在這里。
讓我困惑的是Int
的類定義,它是abstract final
。
如果我在問這個問題之前沒有閱讀 Scala 中abstract
和final
的含義,我很抱歉,但我很好奇,所以我馬上打出了這篇文章。
所以我想理解的是:Scala 中abstract
、 final
和extends
的語義是否不同? 同樣,據我所知,在 Java 中,不能同時具有abstract
和final
。 那么我如何解釋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 提供
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.