次のテストでは、TesterClassは2つの型パラメーター間の関係に制約を課します。メソッドfunc2()はその制約を破っているようで、どこかでタイピングコンパイルエラーが発生することを期待しています(func2の定義上、またはクラスがString以外の2番目のパラメーターで使用されるときはいつでも)が、そうではありません!
さらに、func2を呼び出して結果を適切に型指定された変数に保存すると、(その変数の型で)コンパイルが失敗します。ただし、関数の戻り型はどちらの場合も(アップキャストの前に)同じ型である必要があるという事実にもかかわらず、同じことを行い、より一般的な型(Objectなど)に保存することは成功します。
何が起きてる?
ありがとう!
public class TestGenerics {
public static class ParamedType<T> {}
public class TesterClass<A extends ParamedType<B>, B> {
public TesterClass<A, B> func() {
return new TesterClass<A, B>();
}
public TesterClass<A, String> func2() {
return new TesterClass<A, String>();
}
}
public Object test() {
// How can I use these type parameters? Doesn't .func2 now have an invalid return type?
TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();
//TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
Object res = testClass.func2(); // Compiles
return res;
}
}
編集:これはjavacではコンパイルされません(以下に報告されているバージョン)。私はEclipseを使用していて、実際に実行されているコンパイラーを調べようとしています。更新されます。JDT(Eclipseコンパイラ)のバグである可能性があります。
Eclipseのjdtのバグレポートを開きました: https ://bugs.eclipse.org/bugs/show_bug.cgi?id = 333503