2

この質問は、以前の質問に関連しています。オリジナルは、キャストを追加して未チェックの変換を行うことで解決できます。だから今、私は次のコードを持っています:

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()ません。これは矛盾していると感じます。ジェネリック メソッドの暗黙的な変換を許可するルールはありますか?

4

3 に答える 3