2012-09-05 2 views
22

Ich komme aus Java Land Ich habe versucht, mich selbst zu lehren Scala. Kürzlich spielte ich mit der Int Datentyp und ich beschloss, die API für die Int-Klasse zu suchen here.versuchen zu verstehen "finale abstrakte Klasse Int private erweitert AnyVal in Scala

Was verblüfft mich die Klassendefinition war für Int, die abstract final ist.

ich bin entschuldigend, wenn ich nicht auf die Bedeutung von abstract und final in Scala lesen, hat vor diese Frage, aber ich war neugierig, also tippte ich sofort diesen Beitrag ein

Also was ich versuche zu verstehen ist: Sind die Semantiken für abstract, final und extends in Scala anders? Auch hier ist es meines Wissens am besten, dass man in Java abstract und final nicht gleichzeitig haben kann. Also wie interpretiere ich final abstract class Int private extends AnyVal?

+1

gegeben Nein, sie sind es nicht, zumindest im Prinzip (man kann immer noch nicht abstrakt instanziiert, kann man nicht erben/außer Kraft setzt final). AFAIK, der Grund dafür ist, dass Int und andere AnyVal-Typen vor einiger Zeit nur Stubs waren, die dann vom Compiler zur Kompilierzeit neu geschrieben wurden. Sie sind nicht seit [dieses commit] (https://github.com/scala/scala/commit/4253124eecba6bed38f1dc961c5c4ee39a29f730) –

+0

Oh, das sind nützliche Informationen. Danke für das Hinweis auf mich – ilango

Antwort

28

Wie om-nom-nom im Kommentar erwähnt, verbietet abstract Instanziierung (new Int), während final Subklassifizieren verbietet (new Int { ... }).

Der Grund dafür ist, dass scala.Int direkt vom primitiven Integer-Typ der Java Virtual Machine dargestellt wird; die anderen ähnlichen Typen sind Byte, Short, Char, Long, Float, Double, . Da primitive Typen auf der Laufzeit sind (die eine bessere Leistung als sogenannte Boxed-Typen aufweisen) und die JVM keine neuen Primitiven hinzufügen kann, gibt es keine legale Möglichkeit, diese Typen zu erweitern. Es gibt auch keine Möglichkeit, sie zu instanziieren, außer durch Angabe eines Literals (val i: Int = 33).

Scala verfügt über diese Typen, um ein einheitliches Objektsystem zu erstellen, bei dem es keinen logischen Unterschied zwischen primitiven Typen und 'Objekten' gibt. Es gibt jedoch eine hierarchische Unterscheidung an der Spitze, die AnyRef (entsprechend java.lang.Object) und AnyVal (entsprechend diesen primitiven Typen ist und Scala neuen Typ Unit hinzufügen).

Mehr zu dem einheitlichen Typ-System wird durch die Tour of Scala: Unified Types

+0

Sehr geschätzt. – ilango

+0

Ich muss anmerken, dass es auch [accepted SIP] (http://docs.scala-lang.org/sips/pending/value-classes.html) gibt, die die Verwendung von ungepackten Primitiven mit nicht-Standardverhalten entfesseln wird. –

+1

P.S. Und obwohl alle JVM-Primitive durch Subtypen von "AnyVal" repräsentiert werden, ist die Umkehrung nicht wahr ("Unit" wurde bereits erwähnt). In Scala 2.10 ist es möglich, 'AnyVal' zu erweitern und so sogenannte [Value-Classes] (http://docs.scala-lang.org/sips/pending/value-classes.html) zu erzeugen, die für die Implementierung neuer numerischer Klassen, die von Compiler-Optimierungen (zB Inlining) profitieren. –

Verwandte Themen