1

次のように定義されたオブジェクトがあります。

protected Map<String, ? extends List<? extends LightGeometry>> geoms=new HashMap<String,List<LightGeometry>>();

ワイルドカードに準拠しているように見えるオブジェクトを挿入しようとしています

ArrayList<LightGeometry> points=new ArrayList<LightGeometry>();
points.add((LightGeometry)new LightPoint(pt));
geoms.put("point", points);

コンパイラは、次のようなエラーをスローします。

型のメソッドput(String, capture#18-of ? extends List<? extends LightGeometry>)Map<String,capture#18-of ? extends List<? extends LightGeometry>>は引数に適用できません(String, ArrayList<LightGeometry>)

私は何が欠けていますか?

編集: ジェネリック型でワイルドカードを使用する理由geoms基本的には、リストをふるいにかけてキャストすることなく、別のクラスに あるオブジェクトにリスト (サービスを介して取得) を割り当てることができるようになります。 .

public void onSuccess(Map<String, ArrayList<LightPolygon>> result) {
    // TODO Auto-generated method stub
    GWT.log("" + result.size());
    Log.debug("" + result.size());
    long startTime = System.currentTimeMillis();
    if (overlay != null) {
        overlay.setData(result);
        overlay.update();
        Log.debug("time to add features: "
                + (System.currentTimeMillis() - startTime));
    }
}

geoms変数を aにすると、 a を 'Map>` にMap<String, List<LightGeometry>>代入できないというキャスト エラーが発生します。Map<String,ArrayList<LightPolygon>>

4

1 に答える 1

7

一般的なワイルドカードは、「リストを拡張するもの」を意味するのではなく、「リストを拡張する特定のものですが、その特定のものがわからない」ことを意味します。

したがって、特定のものが何であるかがわからないため、コレクションに何かを追加することは違法です! これは LinkedList のマップである可能性があり、ここでは ArrayList をその中に入れています。これにより、他の誰かが LinkedList であると想定したときにクラス キャスト例外が発生します。

任意のタイプのリストを保持するマップが必要な場合は、? のマップではなく、リストのマップとして宣言するだけです。リストを拡張します。

--

tl;dr - ワイルドカードを使用せずに、必要なことを行います。ワイルドカードは通常、型が何であるかを知っているかどうかが問題にならないメソッド シグネチャを指定するために使用されます。サブクラスを保持するコレクションだけが必要な場合は、スーパータイプを指定するだけです。

例:

Map<String, List<Number>> map = new HashMap<String,List<Number>>();

List<Number> integers =new ArrayList<Number>();
integers.add(Integer.valueOf(1));
map.put("integers", integers);

List<Number> floats = new LinkedList<Number>(); 
floats.add(Float.valueOf(5.2f));
map.put("floats", floats);

キャスティングなし!

于 2012-04-26T19:36:55.570 に答える