这是我的问题: 我在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.
我认为这不干净。有没有办法避免在不丢弃函数中使用通配符的情况下进行转换?
答案 0 :(得分:3)
首先,您的setData
方法应为:
public void setData(Map<String,? extends List<? extends SomeInterface>>)
您的地图声明应为:
Map<String, List<ImplementsSomeInterface>> a = ...;
在您对原始问题进行编辑后,这几乎就是您所拥有的。我从ArrayList
到List
所做的更改不会影响代码的行为。
以下评论:
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)
{
}
答案 1 :(得分:1)
问题是setData作为参数a
Map<String,? extends ArrayList<? extends SomeClass>>
地图&GT;
而在你的第一次调用(不编译的那个)中,你试图传递一个Map<String,? extends SomeClass>
Java无法自动转换子类
SomeClass
到。的子类
ArrayList<? extends SomeClass>
因为它不一定是ArrayList的一个实例。