如何使用通配符将泛型传递给函数而不进行转换?

时间:2012-04-26 13:34:11

标签: java generics bounded-wildcard

这是我的问题: 我在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.

我认为这不干净。有没有办法避免在不丢弃函数中使用通配符的情况下进行转换?

2 个答案:

答案 0 :(得分:3)

首先,您的setData方法应为:

public void setData(Map<String,? extends List<? extends SomeInterface>>)

您的地图声明应为:

Map<String, List<ImplementsSomeInterface>> a = ...;

在您对原始问题进行编辑后,这几乎就是您所拥有的。我从ArrayListList所做的更改不会影响代码的行为。

以下评论:

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的一个实例。