Ho la seguente classe:Sovraccarico ambiguo in Java8: ECJ o javac sono corretti?
import java.util.HashSet;
import java.util.List;
public class OverloadTest<T> extends HashSet<List<T>> {
private static final long serialVersionUID = 1L;
public OverloadTest(OverloadTest<? extends T> other) {}
public OverloadTest(HashSet<? extends T> source) {}
private OverloadTest<Object> source;
public void notAmbigious() {
OverloadTest<Object> o1 = new OverloadTest<Object>(source);
}
public void ambigious() {
OverloadTest<Object> o2 = new OverloadTest<>(source);
}
}
Questo compila bene sotto javac del JDK 7, così come Eclipse (con il rispetto impostata su 1.7 o 1.8). Tuttavia, il tentativo di compilare sotto javac del JDK 8, ricevo il seguente errore:
[ERROR] src/main/java/OverloadTest.java:[18,35] reference to OverloadTest is ambiguous
[ERROR] both constructor <T>OverloadTest(OverloadTest<? extends T>) in OverloadTest and constructor <T>OverloadTest(java.util.HashSet<? extends T>) in OverloadTest match
Si noti che questo errore si applica solo al costruttore di invocazione del metodo ambigous()
, non quello nel metodo notAmbiguous()
. L'unica differenza è che ambiguous()
si basa sull'operatore di diamante.
La mia domanda è questa: javac sotto JDK 8 segnala correttamente una risoluzione ambigua o javac sotto JDK 7 non riesce a cogliere un'ambiguità? A seconda della risposta, ho bisogno di presentare un bug JDK o un bug di ecj.
Direi piuttosto un bug JDK, poiché sembra che si rompa la compatibilità con le versioni precedenti! – macias
Non ricordo i dettagli, ma se ricordo male c'era un bug in JDK 7 dove qualcosa di simile era permesso per errore, e JDK 8 ha controlli più severi. Quindi sì, un'interruzione nella retrocompatibilità, ma di proposito. – Jesper
Per ulteriori dettagli, vedere [Incompatibilità tra JDK 8 e JDK 7] (http://www.oracle.com/technetwork/java/javase/8-compatibility-guide-2156366.html#A999387) nella documentazione di Oracle. – Jesper