Kuchenmuster mit überlagerndem abstrakten Typ funktioniert nicht mit oberen Typgrenzen

8

Ich möchte den abstrakten Typ im Merkmal mit <: und nicht mit = überschreiben (wie hier antworten Scala Upper Bounds: Wert ist kein Mitglied des Typparameters ".

Ich möchte Kuchenmuster verwenden, aber das funktioniert nicht, ich verstehe nicht warum?

%Vor%

OK, dieses Beispiel läuft, aber in meinem realen Anwendungsfall möchte ich den Typ mit <: und nicht mit = überschreiben. Es scheint unmöglich, auf die t-Funktion zuzugreifen, warum?

%Vor%

gibt einen Fehler value ping is not a member of S.this.T

zurück     
reyman64 18.04.2012, 16:05
quelle

1 Antwort

15

Es ist ein Manko von Scala's type system. Bei der Festlegung der Mitglieder in einem Mixin verwendet Scala zwei Regeln: Erstens überschreibt concrete immer abstrakt. Zweitens, wenn zwei Mitglieder beide konkret oder beide abstrakt sind, dann gewinnt derjenige, der später in der Linearisierungsreihenfolge kommt.

Außerdem der Selbsttyp eines Merkmals

%Vor%

wird implizit auf

erweitert %Vor%

, so dass auf Definitionen in der Eigenschaft S innerhalb von S zugegriffen werden kann. In Ihrem Fall wird die Eigenschaft S wie folgt gesehen:

%Vor%

Nun, solange T konkret ist, ist das in Ordnung, weil es das abstrakte T in Cake überschreibt. Aber wenn T abstrakt ist, kommt der in Cake später in der Linearisierungsreihenfolge und gewinnt. Und das T hat keine Obergrenze, also kein Member-Ping. Eine Möglichkeit, dies zu beheben, besteht darin, die Linearisierungsreihenfolge zu ändern, indem Sie Folgendes schreiben:

%Vor%

Es wäre sauberer, wenn Scala eine andere Regel hätte, die besagt, dass alle Einschränkungen von Elementen des abstrakten Typs in der Mischung zusammengeführt werden, anstatt ein einzelnes Element gemäß der Linearisierungsreihenfolge auszuwählen. Das ist eine Änderung, die wir in Zukunft in Betracht ziehen wollen, aber wir müssen vorsichtig mit der Rückwärtskompatibilität sein.

    
Martin Odersky 19.04.2012, 07:21
quelle