我有一个对象定义如下:
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
变量设为Map<String, List<LightGeometry>>
,那么我会收到一个强制转换错误,指出我无法将Map<String,ArrayList<LightPolygon>>
分配给“地图&gt;”
答案 0 :(得分:7)
通用通配符并不意味着“扩展列表的任何内容”这意味着“扩展List的某些特定内容,但我不知道具体是什么。”
因此,在集合中添加任何内容都是违法的,因为您不知道具体是什么!它可能是LinkedLists的映射,在这里你将一个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);
没有演员!