2015-08-28 48 views
4

当我创建一个列表时,我希望尽可能地初始化它;所以我用了Arrays.asList。但是,它似乎不是继承的协变。在Java中使用Arrays.asList的协方差?

例如,

List<NameValuePair> p = Arrays.asList(new BasicNameValuePair("c", coin), new BasicNameValuePair("mk_type", fromCoin)); 

不起作用(BasicNameValuePair是派生类的NameValuePair)。

尽管可以照常使用add

List<NameValuePair> pairs = new ArrayList<>(); 
pairs.add(new BasicNameValuePair("c", coin)); 
pairs.add(new BasicNameValuePair("mk_type", fromCoin)); 

由于库API只接受List<NameValuePair>类型作为参数,我必须定义pairs这种方式。有什么办法可以优雅地处理这个问题吗?

+1

它在java 8中工作。 – ZhongYu

+0

@ bayou.io:虽然我接受它的工作原理,但我不明白为什么。与数组不同,泛型在Java中从来都不是协变的。教条是阵列是协变和物化的;泛型是不变的,被删除。 “列表”绝不应该是“列表”的子类型。 – scottb

+2

@scottb - 在java5-7中,这种情况下的类型推断只查看参数类型。 Java8改进了类型推断并考虑了更多的约束,在这种情况下,分配类型; ''NameValuePair>'被推断为'asList' – ZhongYu

回答

5

如果我明白你的问题,那么我相信你可以使用的方法调用的明确泛型类型来Arrays.asList

List<NameValuePair> p = Arrays.<NameValuePair>asList(new BasicNameValuePair(
     "c", coin), new BasicNameValuePair("mk_type", fromCoin)); 

Generic Methods (The Java Tutorials)

3

您只需给它一个通用的提示:

List<NameValuePair> p = Arrays.<NameValuePair>asList(new BasicNameValuePair("c", coin), new BasicNameValuePair("mk_type", fromCoin));