Compiler verhalten sich anders mit einem Null-Parameter einer generischen Methode
Der folgende Code wird perfekt mit Eclipse kompiliert, kann jedoch nicht mit javac kompiliert werden:
public class HowBizarre {
public static <P extends Number, T extends P> void doIt(P value) {
}
public static void main(String[] args) {
doIt(null);
}
}
Ich habe den Code vereinfacht, daher wird T jetzt überhaupt nicht verwendet. Trotzdem sehe ich keinen Grund für den Fehler. Aus irgendeinem Grund entscheidet javac, dass T für Object steht, und beschwert sich dann, dass Object nicht den Grenzen von T entspricht (was wahr ist):
HowBizarre.java: 6: inkompatible Typen; abgeleitete Typargumente java.lang.Number, java.lang.Object entsprechen nicht den Grenzen der Typvariablen P, T
found:<P,T>
Leer
erforderlich: void
doIt(null);
^
Beachten Sie, dass die Kompilierung problemlos funktioniert, wenn ich den Null-Parameter durch einen Nicht-Null-Wert ersetze.
Welche Compiler verhalten sich richtig und warum? Ist das ein Fehler von einem von ihnen?