Frage

Die folgende Scala-Klasse:

class Foo[+T <: Bar] extends FooBase ...

definiert effektiv eine Typhierarchie, deren Wurzel Foo [Bar] ist - d. h. jedes gültige Foo [X] kann einem Foo [Bar] -Wert oder einer Foo [Bar] -Variable zugewiesen werden:

val v1: Foo[Bar] = new Foo[SubBar1]();
val v2: Foo[Bar] = new Foo[SubBar2]();

FooBase ist weiter oben und könnte auch Objekte implizieren, die nicht Foo sind - das Folgende zeigt das Problem:

class Trouble extends FooBase ...
val iOnlyWantFooHere: FooBase = new Trouble();

... und auch FooBase kennt den Typ T nicht, daher können seine Mitglieder ihn nicht angeben, und ich müsste diese Definitionen in Foo überschreiben, um sie zu spezialisieren:

class FooBase {
  def ohNoIDontKnowTheType: Bar;
}

class Foo[+T <: Bar] extends FooBase {
  override def ohNoIDontKnowTheType: T = ...;
}

Es gibt andere Möglichkeiten, um dieses Problem zu umgehen, aber der Punkt sollte klar sein.

Schließlich ist meine eigentliche Frage, was die Wurzel der folgenden Hierarchie ist:

class Foo[+T <: Foo[T]] extends FooBase ...

Sagen Sie mir auch hier nicht FooBase, da dies nicht der Fall ist. Ja, ich könnte speziell für diesen Zweck eine andere Klasse dazwischen einfügen, aber das ist immer noch keine echte Antwort, wie oben angegeben.

Scala mag nicht nur Foo (ohne den Typparameter), und es ist auch kein Foo[_], da der Zugriff auf Methoden, die den Wert des Typparametertyps zurückgeben, tatsächlich Any und nicht Foo ist. Natürlich können wir auch keinen Foo[Foo] erstellen, da dabei auch der Typparameter für den zweiten fehlt und Foo[Foo[_]] oder Foo[Foo[Foo[Foo[_]]] nur so viele Ebenen ergibt.

Gibt es überhaupt eine Antwort oder wird Scala dafür nicht unterstützt?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Wie wäre es mit Foo[_ <: Foo[_]]?Was ich übrigens in meiner Antwort auf Ihre andere Frage erwähnt habe.Oder Sie könnten es so schreiben:

type Base = Foo[t] forSome { type t <: Foo[t] }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top