Ein Selbsttyp für ein Merkmal A
:
trait B
trait A { this: B => }
sagt, dass " A
kann nicht in eine konkrete Klasse gemischt werden, die nicht auch die B
" .
Auf der anderen Seite, die folgenden:
trait B
trait A extends B
sagt, dass "jede (konkrete oder abstrakte) Klasse, die in A
wird auch in B gemischt" .
Bedeuten diese beiden Aussagen nicht das Gleiche? Der Selbsttyp scheint nur dazu zu dienen, die Möglichkeit eines einfachen Kompilierfehlers zu schaffen.
Was übersehe ich?
0 Stimmen
Ich interessiere mich eigentlich für die Unterschiede zwischen Selbsttypen und Unterklassen in Traits. Ich kenne einige der üblichen Verwendungszwecke für Selbsttypen; ich kann nur keinen Grund finden, warum sie nicht auf die gleiche Weise mit Subtypisierung durchgeführt werden sollten.
35 Stimmen
Man kann Typparameter innerhalb von Selbsttypen verwenden:
trait A[Self] {this: Self => }
ist legal,trait A[Self] extends Self
ist es nicht.4 Stimmen
Ein Selbsttyp kann auch eine Klasse sein, aber ein Trait kann nicht von einer Klasse erben.
10 Stimmen
@cvogt: ein Trait kann von einer Klasse erben (zumindest ab 2.10): pastebin.com/zShvr8LX
1 Stimmen
@Blaisorblade: Ist das nicht etwas, das durch eine kleine Umgestaltung der Sprache gelöst werden könnte, und keine grundlegende Einschränkung? (zumindest vom Standpunkt der Frage aus gesehen)
0 Stimmen
@ErikAllik: Ich habe von dieser Einschränkung aus dem Papier erfahren, in dem das Kuchenmuster "skalierbare Komponentenabstraktionen" beschrieben wird, daher bezweifle ich, dass das ein Zufall ist. Ich vermute, dass die Gründe einfach auf die Einschränkungen der JVM zurückzuführen sind und nicht auf tiefere Beweggründe, aber das bedeutet nicht unbedingt, dass eine Lösung möglich ist.
0 Stimmen
Ich fand diesen Selbsttyp sehr nützlich, um Klassen, die einen Trait implementieren, mitzuteilen, dass sie einen (versiegelten) trait-Enum . Siehe dies: stackoverflow.com/q/36066238/1206998