2016-02-24 119 views
2

我有一个方法需要List<X<?>>。当我尝试将它传递一个List<X<Long>>它无法编译。为什么?为什么我不能做列表<X<Long>>作为列表的参数<X<?>>

+3

你能不能告诉我们,真实失败的实际代码,编译错误消息:

如果要能够采取论据与不同类型的参数,可以在顶层使用通配符? – childofsoong

+0

你应该申报你的方法作为'富(名单> ARG)',而不是'FOO(名单>)'。 – user2357112

回答

2

A List<X<Long>>不计为List<X<?>>。考虑List<X<?>>add方法。这需要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<?>>,让你的方法一般:

public static void <T> foo(List<X<T>> arg) { 
    ... 
} 
0

泛型是不随类型参数。 List<X<Long>>不是List<X<?>>即使X<Long>X<?>亚型亚型,就像List<String>怎么不是List<Object>即使StringObject子类型的子类型。

void foo(List<? extends X<?>> arg) { 
    ... 
} 
相关问题