Ich nehme an Martin Oderskys Kurs über funktionale Programmierung mit scala teil und habe im Moment zwei Dinge gelernt, die zusammen keinen Sinn ergeben:
- Scala unterstützt keine Mehrfachvererbung
Nothing
ist ein Subtyp von jedem anderen Typ
Diese beiden Aussagen können nicht zusammenleben. Wie genau geschieht das? und was genau ist die Bedeutung von "Untertyp von jedem anderen Typ"
Bearbeiten 1
In der Scala API , Nothing
ist definiert als abstract final class Nothing extends Any
... so wie es andere Klassen erweitern?
programming-languages
scala
vainolo
quelle
quelle
Nothing
eine Unterklasse jeder anderen Klasse ist. Es sagt, dass es ein Subtyp von jedem anderen Typ ist .Antworten:
Subtypisierung und Vererbung sind zwei verschiedene Dinge! Erweitert
Nothing
nicht alles, es ist ein Subtyp , es erweitert nur .Any
Die Spezifikation [§3.5.2] hat einen Sonderfall, der die Subtypisierungsbeziehung regelt von
Nothing
:Wobei im
<:
Grunde bedeutet "ist ein Subtyp von".Wie das gemacht wird: Wir wissen nicht, es ist die Magie des Compilers und ein Implementierungsdetail.
Sehr oft macht eine Sprache Dinge, die Sie als Programmierer nicht können. Als Gegenstück zu
Nothing
: Alles in Scala erbt vonAny
, alles außerAny
. WarumAny
erbt nicht von etwas? Das kannst du nicht machen. Warum kann Scala das? Nun, weil Scala die Regeln festgelegt hat, nicht Sie.Nothing
ein Subtyp von allem zu sein, ist nur ein weiteres Beispiel dafür.quelle
null
die Zuweisung zu einem Feld jedes Typs in Java. Warum ist das möglich? Istnull
eine Instanz jeder Klasse? Nein, es ist möglich, weil der Compiler dies sagt. Zeitraum.extends
in Java und nicht so komponieren) ) Sie tun es doch für die Subtypisierung.Wenn er sagt, dass Scala die Mehrfachvererbung nicht unterstützt, bezieht er sich darauf, eine Methodenimplementierung mehrmals zu erben. Natürlich können Sie mehrere Interfaces / Merkmale in einer Klasse implementieren, und sie können sogar dieselbe Methode definieren, aber Sie erhalten keinen Konflikt zwischen den verschiedenen Implementierungen aufgrund der Merkmallinearisierung.
Wenn Sie eine Klasse
C1
mit einer Methodef()
und eine KlasseC2
auch mit einer Methode habenf()
, bedeutet Mehrfachvererbung im Allgemeinen, dass Sie beide Implementierungen von irgendwie erben könnenf()
. Dies kann zu verschiedenen Problemen führen, die Scala dadurch löst, dass Sie nur von einer einzelnen Klasse erben lassen und bei mehreren Merkmalen eine Implementierung anhand der Reihenfolge der Merkmale auswählen.Was
Nothing
sind die Dinge wirklich einfach, weil nichts definiert keine Attribute oder Methoden hat. Sie können also keine Vererbungskonflikte haben. Aber ich gehe davon aus, dass der größte Teil Ihrer Überraschung auf einem anderen Verständnis der Mehrfachvererbung beruht.Wenn Sie verstanden haben, dass die Linearisierung von Merkmalen die Mehrdeutigkeit der Vererbung effektiv beseitigt und wir das Erben von mehreren Merkmalen aus diesem Grund nicht als Mehrfachvererbung bezeichnen , sollten Sie in Ordnung sein.
Wie dies realisiert wird: Der Compiler ist letztendlich dafür verantwortlich. Weitere Informationen finden Sie in der Scala-Sprachspezifikation in Abschnitt 3.5.2, der unter anderem Folgendes enthält:
Mit anderen Worten, wenn Sie einen Compiler korrekt implementieren möchten, muss er nach
Nothing
Spezifikation als Subtyp von allem behandelt werden. Aus offensichtlichen GründenNothing
gilt die Definition nicht für alle in das System geladenen Klassen. Die Relevanz der DefinitionNothing
als Untertyp ist jedoch auf alle Stellen beschränkt, an denen die Untertypisierung relevant ist.Ein wichtiger Punkt hierbei ist, dass es keine Instanz eines Typs
Nothing
gibt. Daher ist seine Behandlung streng auf die Typprüfung beschränkt, die sich ausschließlich im Bereich des Compilers befindet.quelle