私は次のクラスを持っています:
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);
}
}
これは、JDK 7 の javac と eclipse (コンプライアンスを 1.7 または 1.8 に設定) で正常にコンパイルされます。ただし、JDK 8 の javac でコンパイルしようとすると、次のエラーが発生します。
[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
このエラーは、メソッド内のコンストラクター呼び出しではambigous()
なく、メソッド内のコンストラクター呼び出しにのみ適用されることに注意してくださいnotAmbiguous()
。唯一の違いはambiguous()
、ダイヤモンド演算子に依存していることです。
私の質問は次のとおりです。JDK 8 の javac はあいまいな解決策に適切にフラグを立てていますか、それとも JDK 7 の javac はあいまいさをキャッチできませんでしたか? 回答に応じて、JDK バグまたは ecj バグを報告する必要があります。