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 = ...;

这几乎就是您对原始问题进行编辑后得到的结果。我对 to 所做的更改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)      
{
}
于 2012-04-26T13:44:52.633 回答
1

问题是 setData 将 Map> 作为参数, Map<String,? extends ArrayList<? extends SomeClass>>而在您的第一次调用(未编译的调用)中,您试图将其传递给Map<String,? extends SomeClass>

Java 不能自动将子类 SomeClass 转换为子类, ArrayList<? extends SomeClass> 因为它不一定是 ArrayList 的实例。

于 2012-04-26T13:43:07.897 回答