0
public class MyClass<T> {

    private Map<Class<?>, Object> member;

    public <E> void putEnumSet(Class<E> enumSetType, E enumSet) {
        this.member.put(enumSetType, enumSetType.cast(enumSet));
    }

    public <E> E getEnumSet(Class<E> enumType) {
        return enumType.cast(this.member.get(enumType));
    }

};

public enum Category {
    // ...
};

memberinは、異なるEnum タイプを持ついくつかの種類のEnumSetMyClassを格納するために使用されます。相対メソッドを実装しているときに、次のようにメソッドを呼び出そうとすると、いくつかの問題が発生します。

public static void main(String[] args) {

    EnumSet<Category> set = EnumSet.noneOf(Category.class);

    MyClass<Word> newClass = new MyClass<Word>();
    newClass.putEnumSet(set.getClass(), set);

}

エラーが発生します:

putEnumSet(Class<E>, E)型のメソッドMyClass<Word>は引数に適用できません(Class<capture#1-of ? extends EnumSet>, EnumSet<Category>)

この問題に対処するには?raw typeまたはtype eraserに由来する可能性があると思いますが、主な理由はわかりません。ありがとう。

4

2 に答える 2

1

この問題に対処するには?

E extends EnumSet<E>

Eこれは、拡張EnumSet<E>する必要がある要素が必要である、つまり、それ自体がEnumSetof である要素タイプが必要であると言っているため、非常に混乱します。E


実行時にすべての EnumSet クラスが同じであるという問題があります。つまり、EnumSet.class は 1 つしかありません。要素のクラスを記録することをお勧めします。

public class MyClass {

    private Map<Class, Set> member;

    public <E> void putEnumSet(Class<E> elementType, Set<E> enumSet) {
        this.member.put(elementType, enumSet);
    }

    public <E> Set<E> getEnumSet(Class<E> elementType) {
        return (Set<E>) this.member.get(elementType));
    }
};
于 2014-12-28T10:17:01.010 に答える