2012-06-28 9 views
5

Mögliche Duplizieren:
What is the difference between scala self-types and trait subclasses?Was bedeutet eine Objekt-Selbstanmerkung?

Ich verstehe eine Selbst Anmerkung als ein Versprechen an den Compiler, wo der Programmierer zeigt, dass ein Merkmal mit den kommentierten einen seinen mixin. Zum Beispiel:

scala> trait X 
defined trait X 

scala> trait Y { this: X => } 
defined trait Y 

scala> new Y {} 
<console>:10: error: illegal inheritance; 
self-type Y does not conform to Y's selftype Y with X 
       new Y {} 
       ^

scala> new Y with X {} 
res1: Y with X = [email protected] 

Im vorherigen Beispiel scheiterte der dritte Ausdruck, weil wir keine gültigen X auf die neue Instanz festgelegt haben. Offensichtlich funktioniert das letzte gut. So weit, ist es gut. Und jetzt, lassen Sie uns ein anderes Beispiel sehen, das ein Objekt betrifft.

scala> object Z { this: X => } 
defined module Z 

Ich verstehe das Objekt instanziiert wird mit dem X Versprechen versagt (wir eine Instanz jetzt mit Zukunft Versprechen schaffen!), Wie sie in den nächsten Zeilen dargestellt, wobei die Züge leicht modifiziert wurden:

scala> trait X { class X1 } 
defined trait X 

scala> trait Y { this: X => new X1 } 
defined trait Y 

scala> object Z { this: X => new X1 } 
<console>:8: error: not found: type X1 
     object Z { this: X => new X1 } 
           ^

Also, was bedeutet die Objekt-Selbstannotation?

Antwort

3

In der Tat können Sie das gleiche mit Klassen tun - fügen Sie einen Selbst-Typ, der nicht vererbt wird, aber Sie werden nicht in der Lage, eine solche Klasse zu instanziieren.

Das Zulassen, dass Singleton-Objekte eigene Typen haben, macht Programme in keiner Weise ungültig - Sie können einfach keine der Methoden des Selbst-Typs (oder seiner inneren Klassen) aus dem Singleton-Objekt aufrufen, weil es den Selbsttyp nicht erbte.

Dennoch kann es ein Fehler sein, möchten Sie vielleicht file a bug.

+0

Ich denke, dass im Klassenfall, zum Beispiel: "Klasse A {das: X => neue X1}" Sie können mit "neuen A mit X" spielen, so hat es Sinn, aber ich kann keine Situation finden wo Man könnte die selbe Annotation in einem Objekt benötigen. – jeslg

+0

Richtig, für Objekte und letzte Klassen macht es keinen Sinn, dass ich sehen kann. – axel22

+0

Wohlgemerkt, ich denke, dass Objekte überschrieben werden können, wenn sie Mitglieder eines Merkmals oder einer Klasse sind. –