通配符类型匹配 - Java

时间:2014-11-20 00:23:00

标签: java generics

为什么下面的代码不能编译?

public static <T> void foo_test(List<? extends T> src, List<T> dest) {
   for (T o : src) {
        dest.add(o);
   }
}

public static void main(String [] args) {
   List<Number> numbers = new ArrayList<Number>();
   List<Integer> integers = new ArrayList<Integer>();
   foo_test(numbers, integers);
}

2 个答案:

答案 0 :(得分:5)

您不应该也不能将数字列表添加到整数列表中;数字可能不是整数。但是,您可以将一个整数列表添加到数字列表中,这是您键入内容的后退。

这将有效:

foo_test(integers, numbers);

详细说明,代码中T被推断为Integer,但Number未延伸Integer,因此调用是编译错误。

切换为foo_test(integers, numbers)会将T推断为NumberInteger会延伸Number,以便进行编译。

答案 1 :(得分:1)

您需要切换integersnumberssrc列表必须是比dest更具体的类型。