2017-05-29 6 views
0

Ich kann ein Feld haben, das sich auf ein Element des abstrakten Typs in Scala bezieht, z.B.Bezugnehmend auf Member des abstrakten Typs in Klassenkonstruktoren in Scala

abstract class C { 
    type T 
    val t: T 
} 

aber es scheint, dass ich nicht das Gleiche für einen Konstruktorparameter tun können:

abstract class C(t: T) { // not found: type T 
    type T 
} 

Warum?

+0

Hauptgrund, warum Sie so nicht tun können, ist, wie Polymorphismus in scala implementiert ist. Antworten auf Ihre Frage decken eine große Anzahl von Bereichen ab, die einige Zeit benötigen, um sie zu erklären. Versuchen Sie, lesen Sie den nächsten Artikel: https://twitter.github.io/scala_school/type-basics.html und grasen Sie Typ Parameter und auch implizit, wenn tieferes Verständnis benötigt. – Pavel

Antwort

2

Die erste Definitionszeile einer Klasse ist ein Konstruktor, so dass sie unabhängig von einer bestimmten Implementierung der Klasse ist (da Sie sie erstellen, können Sie den abstrakten Typ member noch nicht kennen).

Aber was können Sie tun, ist eine Art Parameter Ihrer Klasse geben:

abstract class C[T](c: T) { 
} 

Damit T kann im Konstruktor verwendet werden (was nur eine typabhängigen Methode ist, jetzt). Beachten Sie, dass Typ-Parameter und die Mitglieder sind zwei verschiedene Dinge, so dass Sie dies nicht tun können:

val stringC = new C("foo") {} // the {} enables instantiation of abstract classes 
val other: stringC.T = "bar" 

Wenn Sie stringC.T Notation verwenden möchten, müssen Sie einen Typ-Member definieren, die zu Ihrem Typ-Parameter gleich ist:

class C[A](c: A) { 
    type T = A 
} 
Verwandte Themen