0

ここに私の問題があります:クラスAの私の関数:

public void setData(Map<String,? extends ArrayList<? extends SomeInterface>>){...}

私の電話:

Map<String, ArrayList<ImplementsSomeInterface>> a=...;
instanceOfA.setData(a); //does not compile
instanceOfA.setData((Map<String,? extends ArrayList<? extends SomeInterface>>) a); // works thanks to the Casting.

これはきれいではないと思います。関数でワイルドカードの使用を削除せずにキャストを回避する方法はありますか?

4

2 に答える 2

3

まず、setDataメソッドは次のようになります。

public void setData(Map<String,? extends List<? extends SomeInterface>>)

マップ宣言は次のようになります。

Map<String, List<ImplementsSomeInterface>> a = ...;

これは、元の質問を編集した後のほとんどのものです。から への変更は、コードの動作には影響ArrayListListません。

以下のコメント:

public static void main() 
{
    Map<String, List<Double>> map = new HashMap<String, List<Double>>();
    map.put("prices", new ArrayList<Double>(Arrays.asList(1.1, 2.2, 3.3)));

    setData(map);
}

public static void setData(Map<String,? extends List<? extends Serializable>> map)      
{
}
于 2012-04-26T13:44:52.633 に答える
1

問題は、setData が引数として Map<String,? extends ArrayList<? extends SomeClass>>Map> を取るのに対し、最初の呼び出し (コンパイルされない呼び出し) では、それを渡そうとしていることです。Map<String,? extends SomeClass>

必ずしもArrayList のインスタンスではないため、Java は のサブクラスSomeClass を の サブクラスに自動的にキャストできません 。ArrayList<? extends SomeClass>

于 2012-04-26T13:43:07.897 に答える