この質問は、以前の質問に関連しています。オリジナルは、キャストを追加して未チェックの変換を行うことで解決できます。だから今、私は次のコードを持っています:
import java.util.EnumSet;
class A {
static enum E1 {
X
}
private static <T extends Enum<T>> EnumSet<T> barEnum(Class<T> x) {
return null;
}
private static void foo1(EnumSet<E1> s, E1 e) {
EnumSet<E1> x2 = barEnum((Class<E1>)e.getClass());
}
private static void foo2(EnumSet<E1> s) {
EnumSet<E1> x = barEnum((Class<E1>)s.iterator().next().getClass());
}
}
私の当初の意図は、ジェネリック メソッドを作成することでした。そこで、この方法foo2()
を次のように一般化しました。
private static <E extends Enum<E>> void foo3(EnumSet<E> s) {
EnumSet<E> x = barEnum(s.iterator().next().getClass());
}
これには明らかに未チェックの変換が含まれており、適切な警告でコンパイルされます。getClass()
しかし、明示的にの結果を にキャストしませんClass<E>
。foo1()
はジェネリック メソッドの 1 つのインスタンスであるため、foo3()
ここにもキャストを追加する必要があると予想しました。比較foo1()
してfoo4()
...
private static void foo4(EnumSet<E1> s) {
EnumSet<E1> x = barEnum(s.iterator().next().getClass());
}
...この 2 つは事実上似ています (主な違いは のE1 e
パラメータですfoo1()
)。ただしfoo1()
、コンパイルされますが、コンパイルされfoo4()
ません。これは矛盾していると感じます。ジェネリック メソッドの暗黙的な変換を許可するルールはありますか?