0

次のテストクラスを作成しました。

public class GenericTest {

    public static class A implements Serializable {

    }

    public static class B implements Serializable {

    }

    public static void main(String[] args) {
        // Error: Type mismatch: cannot convert from List<capture#1-of ? extends Serializable> to List<GenericTest.A>
        //List<A> aList = getInfo().get("A");
        //List<B> BList = getInfo().get("B");

        // Warning: Type safety: Unchecked cast from List<capture#1-of ? extends Serializable> to List<GenericTest.A>
        List<A> aList = (List<A>)getInfo().get("A");
        List<B> BList = (List<B>)getInfo().get("B");
    }

    public static Map<String, List<? extends Serializable>> getInfo() {
        Map<String, List<? extends Serializable>> infoMap = new HashMap<String, List<? extends Serializable>>();

        List<A> aList = new ArrayList<A>();
        List<B> bList = new ArrayList<B>();

        try {
            aList.add(new A());
            infoMap.put("A", aList);

            bList.add(new B());
            infoMap.put("B", bList);
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        return infoMap;
    }    
}

チェックされていない警告をキャストして抑制することを避けるために、これを回避するためのより良い方法はありますか?キャスティングを使用すると、そもそもジェネリックを使用する目的がほとんどなくなると言われています。これに問題がありますか、それとも「より安全な」方法でそれを実行できますか?

4

2 に答える 2

2

あなたはこれをやってみることができます。getListメソッドで警告を抑制する必要がありますが、addToMapメソッドを使用してリストを追加するだけの場合、コンパイラーは、追加されたリストが最初のパラメーターで使用されたのと同じタイプのクラスであるかどうかを正しくチェックできます。また、スーパータイプのトークンをグーグルで検索します。

public static void main(String[] args) {
    List<A> aList = new ArrayList<A>();
    aList.add(new A());
    List<B> bList = new ArrayList<B>();
    bList.add(new B());
    addToMap(A.class,aList);
    addToMap(B.class,bList);        

    List<A> aListFromMap = getList(A.class);
    List<B> bListFromMap = getList(B.class);
}



private static Map<Class<?>,Object> infoMap = new HashMap<Class<?>,Object>();



public static <T extends Serializable> void addToMap(Class<T> key, List<T> value) {
    infoMap.put(key,value);
}


public static <T extends Serializable> List<T> getList(Class<T> key) {
    return (List<T>)(infoMap.get(key));
} 
于 2012-07-24T19:32:18.673 に答える
1

いいえ、この状況を解決する方法はありません。2種類の値を持つ単一のマップ(これは異種マップと呼ばれます)があり、型システムはそれを表現できません。型安全性なしでダウンキャストする必要があります。それか、完全に再設計して、これら2種類のオブジェクトを2つの別々の構造に保持します。

于 2012-07-24T19:21:01.097 に答える