Ich habe Code aus einer Bibliothek gesehen:
%Vor% Warum muss A
AnyRef
explizit erweitern? Sind nicht alle Klassen bereits implizit von AnyRef
abgeleitet?
Warum muss B
AnyRef
verlängern, obwohl A
dies bereits getan hat? Was ist der Unterschied, um den obigen Code zu ändern:
Ich würde überhaupt keinen Unterschied sagen.
Aus der Scala-Dokumentation
Benutzerdefinierte Klassen definieren standardmäßig Verweistypen; d. h. sie untergliedern immer (indirekt)
scala.AnyRef
.
Um den Punkt weiter zu beweisen
%Vor%Sie müssen AnyRef nicht explizit erweitern. AnyRef entspricht dem Java-Objekt in Scala. Durch das Erstellen einer Instanz einer Klasse erweitert diese Instanz AnyRef implizit, unabhängig davon, ob sie explizit in einer ihrer Superklassen erwähnt wurde oder nicht.
Der folgende Code erstellt nur eine anonyme Klasse und erweitert damit implizit AnyRef:
%Vor%Hier ist die Erklärung von scala-lang.org:
Die Oberklasse aller Klassen scala.Any hat zwei direkte Unterklassen scala.AnyVal und scala.AnyRef, die zwei verschiedene Klassenwelten repräsentieren: Wertklassen und Referenzklassen. Alle Wertklassen sind vordefiniert; Sie entsprechen den primitiven Typen von Java-ähnlichen Sprachen. Alle anderen Klassen definieren Referenztypen. Benutzerdefinierte Klassen definieren standardmäßig Referenztypen; d.h. sie unterteilen immer (indirekt) scala.AnyRef. Jede benutzerdefinierte Klasse in Scala erweitert implizit das Merkmal scala.ScalaObject. Klassen aus der Infrastruktur, auf der Scala ausgeführt wird (z. B. die Java-Laufzeitumgebung), erweitern scala.ScalaObject nicht. Wenn Scala im Kontext einer Java-Laufzeitumgebung verwendet wird, entspricht scala.AnyRef java.lang.Object. Beachten Sie, dass das obige Diagramm auch implizite Konvertierungen anzeigt, die als Ansichten zwischen den Wertklassen bezeichnet werden. Hier ist ein Beispiel, das zeigt, dass sowohl Zahlen, Zeichen, boolesche Werte und Funktionen Objekte sind wie jedes andere Objekt:
Seit Scala 2.10 können Sie AnyVal auch erweitern. Von scala-lang.org:
AnyVal ist die Wurzelklasse aller Werttypen, die Werte beschreiben, die nicht als Objekte im zugrunde liegenden Host-System implementiert sind. Vor Scala 2.10 war AnyVal eine versiegelte Eigenschaft. Ab Scala 2.10 ist es jedoch möglich, eine Unterklasse von AnyVal zu definieren, die als benutzerdefinierte Wertklasse bezeichnet wird und speziell vom Compiler behandelt wird. Richtig definierte Benutzerwertklassen bieten eine Möglichkeit, die Leistung benutzerdefinierter Typen zu verbessern, indem die Objektzuordnung zur Laufzeit vermieden wird und virtuelle Methodenaufrufe durch statische Methodenaufrufe ersetzt werden.
Tags und Links scala