为什么我不能列出<x <long>&gt;作为List <x <?>的参数&gt;

时间:2016-02-24 01:24:39

标签: java generics

我有一个方法需要List<X<?>>。当我尝试传递它List<X<Long>>时,它无法编译。为什么呢?

2 个答案:

答案 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