Multilevel-Java generische Vererbung mit Hilfe erstreckt sich auf generische Parameter
Habe ich
public class First<T> {}
public class Second<T extends SomeConcreteClass> extends First<T> {}
public class Third<T> extends Second<T> {} //Compile-time error
Bekomme ich den compile-Zeit-Fehler
Type argument T is not with bounds of type-variable T.
Wenn ich contruct ein Third
möchte ich, um der Lage sein, um die generischen parameter als SomeConcreteClass
(oder abgeleitete Klasse davon), und für ein run-time-Fehler geworfen werden, wenn ich bereits angeboten werden, eine Art, die nicht Teil der SomeConcreteClass
's Vererbungshierarchie.
Ich würde denken, dass die Spezifikation in Second
's Erklärung würde einfach weitergeben nach unten, d.h. es sollte implizit in der Deklaration (und alle Instanziierungen)Third
.
Was ist mit dem Fehler?
"einen run-time-Fehler geworfen werden, wenn ich bereits angeboten werden, eine Art, die nicht Teil". Ich denke, man kann nicht bekommen, dass. "Angebot-Typen" passiert nur zur compile-time (und dann gelöscht). Wenn Sie deaktivieren (nicht "anbieten" jede Art), dann werden Sie wahrscheinlich ClassCastExceptions irgendwann, aber später, nicht wenn die Instanz von Dritten konstruiert wird.
InformationsquelleAutor Arcane Engineer | 2012-07-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alles, was Sie brauchen, ist
Brauchen Sie nur massenzukopieren die gebunden. Es nicht propagieren, wie Sie denken, es tut.
(Ich bin nicht positiv, der Grund dafür, aber ich habe einige Vermutungen-was, wenn es war
Third<T> extends Second<Foo<T>>
? Die entsprechende GrenzeT
ist nicht offensichtlich, wenn es auch ist. So anstelle, es funktioniert einfach nicht verbreiten, automatisch; Sie haben, um es zu markieren.)InformationsquelleAutor Louis Wasserman
Sie eine nach unten gerichtete Ausbreitung der Grenze, Beschränkung.
Wenn Sie möchten, fügen Sie Ihren code oben in Allgemeinen Begriffen, die Sie deutlich sehen, die eingeschränkte Erklärung. Auch eine weitere Vererbung würde auch schützen zu müssen, oder weiter eingrenzen, dass die Einschränkung. eg :
Beachten Sie, dass es ist jetzt klar, dass Sie nicht haben
Als Sie vermissen, die erforderlich
T2
geben Sie Informationen fürSecond<V,T2>
.Wenn Sie eine konkrete Klasse, diese Einschränkung wird implizit.
InformationsquelleAutor maasg
In unserem Fall kann man wohl durch dies ersetzen:
mit dabei:
Um den T innerhalb des Konstruktors und auch sonst in den code-wie ein Mitglied Feld vom Typ T, dann kann man dies so tun:
Funktioniert. Das wichtigste ist, die generische, die auf die konkreten Klassen mussten angeben, die tatsächlichen konkreten fragment-Klasse, um für den anderen code in die VB-Klasse für den Zugriff auf seine Methoden.
InformationsquelleAutor codeslapper
public class Third<T> extends Second<T> {}
Dies ist ein bound mismatch. Kann man nicht erweitern, den Zweiten mit einem generischen T, wenn Sie haben gerade angegeben, die zweite ist vom Typ T erstreckt sich als SomeConcreteClass. Wenn Sie verlängern Zweitens müssen Sie so tun, mit etwas, das in den Anwendungsbereich des SomeConcreteClass.
public class Third<T> extends Second<ClassThatExtendsSomeConcreteClass> {}
oder nur
public class Third<T> extends Second<SomeConcreteClass> {}
InformationsquelleAutor Rob Wagner