Selbstgebundener generischer Typ mit flüssiger Schnittstelle und Vererbung

9

Ich verwende eine fließende Schnittstelle mit Vererbung. Ich habe den Konstruktor der Basisklasse als geschützt deklariert, so dass Sie keinen Foo & lt; Bar & gt; was beim Aufruf von add () zu einer ClassCastException führen würde. Aber ich habe Probleme mit der statischen Methode, die eine neue Foo-Instanz zurückgibt.

%Vor%

Dies ist meistens eine Übung (persönlich, nicht Hausaufgaben) in fließenden Interfaces, Domain-spezifische Sprache und Generics, also bitte nicht fragen, wofür ich es brauche.

Bearbeiten: Eclipse-Fehler

%Vor%     
Stefan 31.10.2011, 20:27
quelle

1 Antwort

3

Sie haben im Wesentlichen eine rekursive Typdeklaration.

Foo<T extends Foo<T>> .

Nehmen wir an, Sie haben ein Foo<Foo> . Das heißt T wird auf Foo abgebildet. Aber Foo ist kein Untertyp von Foo<T> , was in diesem Fall Foo<Foo> ist. Was du also wirklich suchst, ist Foo<Foo<Foo>> . Aber warte mal, das innerste Foo ist nicht getippt, also denke ich es ist Foo<Foo<Foo<Foo>>> ... oh vergiss es!

Um ein verständlicheres Gesicht zu bekommen, überlegen Sie, ob Sie Foo<T extends List<T>> hatten. Was könnten Sie möglicherweise für T in einer Deklaration / Instanziierung von Foo verwenden? %Code%? List<String> ?

Bearbeiten

Sie haben anscheinend einen Weg gefunden, den Rekursionszyklus zu "brechen". Sie müssen schließlich zu einem verdinglichten Typ kommen. Genauso wie du herausgefunden hast, dass List<List> für dich funktioniert hat, könntest du auch für das obige Beispiel ConcreteFoo eine Klasse List haben, die den Rekursionszyklus unterbricht.

    
Mark Peters 31.10.2011, 21:12
quelle