Warum die Inkonsistenz?
Ich würde sagen, das ist überhaupt keine Inkonsistenz. Dies ist im Grunde ein Problem des Verständnisses von Generika. Betrachten Sie den folgenden Code (Ihr geänderten Code):
class Outer<T> {
class Inner{
T t;//Added this extra line
}
static class Nested {
Inner inner;
}
}
In diesem obigen Beispiel ist ähnlich zu dem, was Sie geschrieben haben, habe ich eine neue Variable t
vom Typ T
hinzugefügt, die die Generika von Outer
Klasse in der Klasse Inner
. Nun würde in diesem obigen Beispiel nicht kompiliert werden, da in der Klasse Inner
ein nicht-statischer oder Laufzeitverweis vorhanden ist. Wenn Sie also Inner
in einer statischen Klasse Nested
deklarieren, kennt der JAVA-Compiler den Typ T
, der nur deklariert wird in der Laufzeit, so erhalten Sie einen Fehler. Aber in Ihrem Fall haben Sie nichts dergleichen getan, aber der Compiler weiß nicht, ob so etwas vorhanden ist oder nicht. So gibt es den Fehler.
Jetzt im zweiten Fall haben Sie die generische T
aus der Klassendeklaration der Outer
entfernt. Es gibt also keine Möglichkeit, die Variable t
in der Klasse Inner
zu deklarieren, so dass kein Fehler auftritt.
Im dritten Fall haben Sie Outer.Inner
für den Typ der Variablen inner
deklariert und es erfolgreich kompiliert.Hier betrachtete der Compiler Outer
als RAW TYPE. Aber diese Art von Rohtyp-Deklarationen sollte vermieden werden. So wäre es besser zu schreiben:
Outer<?>.Inner inner;
Hier Java-Compiler halten Outer
jedes Objekt als Parameter zu nehmen, die Object
erben würde.
Nun, Sie könnten "T" in "Inner", z. eine Mitgliedsvariable Wie würde "Nested" etwas über den Typ wissen, wenn "Outer" generisch ist? –
Ändern Sie diese Zeile in "Outer .Inner innere;" oder eine andere Spezialisierung von 'T' –