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变量 aMap<String, List<LightGeometry>>那么我得到一个转换错误,说我不能将 a 分配Map<String,ArrayList<LightPolygon>>给一个 'Map>`

4

1 回答 1

7

通用通配符并不意味着“任何扩展 List 的东西”它的意思是“扩展 List 的一些特定的东西,但我不知道那个特定的东西是什么”。

因此,在集合中添加任何东西都是非法的,因为您不知道具体的东西是什么!它可能是 LinkedLists 的映射,在这里您将 ArrayList 放入其中,这会导致其他人在假设它是 LinkedList 时获得类转换异常。

如果您想要一个包含任何类型列表的 Map,只需将其声明为 List 的 Map,而不是 ? 扩展列表。

--

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 回答