Geben Sie die Inferenz in JDK 7 restriktiver als in JDK 6 ein?

8

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?

    
Saish 28.12.2011, 19:26
quelle

1 Antwort

3

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.

    
irreputable 28.12.2011, 22:06
quelle