我有一个方法需要List<X<?>>
。当我尝试传递它List<X<Long>>
时,它无法编译。为什么呢?
答案 0 :(得分:2)
List<X<Long>>
不算作List<X<?>>
。考虑add
的{{1}}方法。它需要List<X<?>>
类型的参数,X<?>
计为X<Integer>
。如果我们可以将X<?>
传递给您的方法,我们就可以
List<X<Long>>
我们会向public static void foo(List<X<?>> arg) {
arg.add(new X<Integer>());
}
public static void main(String[] args) {
foo(new ArrayList<X<Integer>>());
}
添加X<Integer>
,违反了类型安全。
不要使用List<X<Long>>
,而是将您的方法设为通用:
List<X<?>>
答案 1 :(得分:0)
泛型在类型参数方面是不变的。 List<X<Long>>
不是List<X<?>>
的子类型,即使X<Long>
是[{1}}的子类型,就像X<?>
不是List<String>
的子类型一样即使List<Object>
是String
的子类型。
如果您希望能够使用不同类型参数获取参数,则可以在顶层使用通配符:
Object