2012-09-05 23 views
22

來自Java的土地我一直在試圖教自己斯卡拉。最近我在玩弄Int數據類型,我決定查找的Int類的API here試圖理解「最終抽象類Int私有擴展在斯卡拉AnyVal

什麼困擾我的是對Int類的定義,這是abstract final

我很抱歉,如果我沒有問這個問題之前,在斯卡拉abstractfinal意義讀了,但我好奇,所以我馬上打出這篇文章。

所以我想了解的是: 在Scala中abstract,finalextends的語義是不同的嗎? 同樣,據我所知,在Java中,同時不能有abstractfinal。 那麼如何解釋final abstract class Int private extends AnyVal

+1

給出不,他們不是,至少基本上(您仍然無法實例化抽象的,你不能繼承/覆蓋決賽)。 AFAIK,這樣做的原因是,前一段時間Int和其他AnyVal類型只是一個存根,在編譯時由編譯器重寫。他們不是因爲[this commit](https://github.com/scala/scala/commit/4253124eecba6bed38f1dc961c5c4ee39a29f730) –

+0

哦,那是有用的信息。感謝您對我指出 – ilango

回答

28

如OM-NOM-NOM在註釋中指出,abstract禁止實例化(new Int),而禁止final子類(new Int { ... })。

原因是scala.Int直接由Java虛擬機的原始整數類型表示;其他類似的類型是Byte,Short,Char,Long,Float,Double,Boolean由於它們是運行時的基本類型(表現出比所謂的盒裝類型更好的性能),並且JVM不允許添加新的基元,所以沒有合法的方式來擴展這些類型。除了通過提供文字(val i: Int = 33),也沒有辦法實例化它們。

斯卡拉有這些類型來創建一個統一的對象系統,其中基本類型和'對象'之間沒有邏輯差異。然而,在頂部有(對應於java.lang.Object)和AnyVal(對應於那些基本類型;並且添加了Scala的新類型Unit)的層次結構區別。

更統一的類型系統是由Tour of Scala: Unified Types

+0

非常感謝。 – ilango

+0

我必須注意,還有[接受的SIP](http://docs.scala-lang.org/sips/pending/value-classes.html),它將釋放帶有非默認行爲的未裝箱原語的使用。 –

+1

P.S.儘管所有的JVM原語都是由AnyVal的子類型來表示的,但反過來卻不正確(已經提到過「單元」)。在Scala 2.10中,可以擴展'AnyVal',創建所謂的[Value-Classes](http://docs.scala-lang.org/sips/pending/value-classes.html)實現新的數字類,受益於編譯器優化(例如內聯)。 –