7

パラメータとして受け取るメソッドがありMap<Integer, Set<Object>>ます。Map<Integer, Set<String>>パラメータとして aと aを使用して、2 つの異なる場所から呼び出す必要がありMap<Integer, Set<Integer>>ます。

コンパイラの不満のため、メソッド パラメーターのシグネチャを に変更しましたMap<Integer, ?>。今は呼び出すことができますが、別の問題があります。方法は基本的に次のとおりです。

private void methodA (Map<Integer, ?> inOutMap, Integer key, Object value) {

        Set<Object> list = new HashSet<Object>();

        if (!inOutMap.containsKey(key)) {
            list.add(value);
        } else {
            list = (Set<Object>) (Set<?>) inOutMap.get(key); //I wrote the cast, but looks quite ugly
            list.add(value);
        }

        inOutMap.put(key, list); //compiler error
        //The method put(Integer, capture#4-of ?) in the type Map<Integer,capture#4-of ?> is not applicable for the arguments (Integer, Set<Object>)
    }

コンパイラエラーを解決する方法はありますか? これは、 へのキャストlistです?

2 番目の質問は概念的なものです。異なるパラメータ シグネチャを持つ 2 つの異なるメソッドを記述する以外に、これを行うためのより良い方法はありますか?

4

3 に答える 3

7

として宣言します

private <T> void methodA (Map<Integer, Set<T>> inOutMap, Integer key, T value) {

        Set<T> list = new HashSet<T>();

        if (!inOutMap.containsKey(key)) {
            list.add(value);
        } else {
            list = inOutMap.get(key); 
            list.add(value);
        }

        inOutMap.put(key, list); 
    }

or (不明な型)を使用するよりも、複数の型の引数を使用しようとしている場合は、常にジェネリックを使用することをお勧めします。Object?

Setこれで、以下のような異なる型を含む同じメソッドを呼び出すことができます

Map<Integer, Set<String>> m1 = new HashMap<Integer, Set<String>>();
Map<Integer, Set<Integer>> m2 = new HashMap<Integer, Set<Integer>>();

methodA(m1, 1, "t");
methodA(m2, 2, 2);
于 2013-05-03T11:03:20.897 に答える
1

これはエラーなしで明示的なキャストなしでコンパイルされます

private <T> void methodA (Map<Integer, Set<T>> inOutMap, Integer key, T value) {
    Set<T> list = new HashSet<T>();
    if (!inOutMap.containsKey(key)) {
        list.add(value);
    } else {
        list = inOutMap.get(key);
        list.add(value);
    }
    inOutMap.put(key, list);
}
于 2013-05-03T11:05:52.857 に答える
0

このように定義できませんか?

Map<Integer, Set<Object>>
于 2013-05-03T11:13:38.937 に答える