Warum wird dieser Code nicht kompiliert?
%Vor% Java 6 gibt diesen Fehler in handle(new ModifiedThingA());
:
Java 7 mag nicht einmal handle(new ThingA());
, das ist die Ausgabe von Java 7:
Es scheint mir, dass javac
ModifiedThingA
für BaseThing<ModifiedThingA>
falsch interpretiert, wenn es tatsächlich ein BaseThing<ThingA>
ist. Ist das mein Fehler oder javac
?
javac
scheint korrekt zu sein. Theoretisch wäre eine Typvariable, T
, ausreichend. Sie haben jedoch eine zweite Typvariable, X
, eingeführt, um die Inferenz entlang zu typisieren. Das Argument für X
wird zuerst abgeleitet und dann wird basierend auf dem Aufrufkontext das Argument für T
abgeleitet:
Ihr Aufrufkontext setzt jedoch keine Grenzen für den Rückgabetyp. Daher ist der Compiler forced um eine Typvariable ( CAP#1
) mit dem Null-Typ als untere Grenze einzuführen. T
's Argument wird als glb(BaseThing<CAP#1>) = BaseThing<CAP#1>
abgeleitet. Mit der unteren Grenze ist X
nicht nachweisbar ein Subtyp von T
.
Es gibt zwei oder drei Wege daraus.
T
von seinem Begrenzungsargument Ich bevorzuge Option 3:
%Vor%Glückliche Generika.
Es scheint einen Fehler in javac 1.7.0_09 und 1.7.0_11 zu geben, der dieses Problem verursacht.