Ich denke, das könnte mit Warum wird eine generische Besetzung einer Liste & lt; erweitert Satz .. & gt; zu Liste & lt; Set .. & gt; erfolgreich auf Sun JDK 6, aber nicht auf Oracle JDK 7 kompilieren?
Wenn wir die folgenden Klassen nehmen, kompilieren sie unter JDK 6:
%Vor%Unter JDK 7 erhalte ich jedoch den folgenden Fehler:
%Vor%Ich dachte, dass Typinferenz in JDK 7 weniger restriktiv war (z. B. Hinzufügen von Konstruktorinferenz). Allerdings weist der Compiler hier einen Typ zurück, der unter JDK 6 gültig ist.
Ist das ein Fehler? Oder wurden die Inferenzregeln für Methoden verschärft?
Streng nach der Spezifikation kann T
nicht abgeleitet werden (per 15.12.2.7), daher sollte es als Object
genommen werden.
Dies kann als Fehler der Spezifikation angesehen werden. Dies ist, wie spec infs R
: zuerst gibt es Constraint R :> BigDecimal
, wobei :>
bedeutet, dass ein Supertyp von ist. Die Inferenzregeln wählen dann R=BigDecimal
, da es der spezifischste Typ ist, der die Bedingung erfüllt.
Nun, da T:>R
, T:>BigDecimal
, würde man meinen, dass dies auch T=BigDecimal
ergeben sollte.
Leider berücksichtigen die Inferenzregeln T:>R
nicht. Es gibt keine Einschränkung für T
. T
wird nicht durch dasselbe Prinzip abgeleitet.
Während es scheiße ist, ist spec spec. Dein Code sollte nicht kompiliert werden. Javac6 ist dort falsch.
In Java 8 gibt es eine große Verbesserung der Inferenzregeln, um den Lambda-Ausdruck einfacher zu machen. Hoffentlich sollte Ihr Code in Java 8 kompiliert werden.
Tags und Links java generics java-7 type-inference