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%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>
?
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.
Tags und Links java inheritance generics fluent-interface