Warum Scala-Klasse AnyRef explizit erweitern muss

8

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:

%Vor%     
jiangok 21.07.2015, 17:16
quelle

2 Antworten

7

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%     
Gabriele Petronella 21.07.2015 17:39
quelle
2

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.

    
Monads are like... 21.07.2015 18:15
quelle

Tags und Links