当我创建一个列表时,我希望尽可能地初始化它;所以我用了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
这种方式。有什么办法可以优雅地处理这个问题吗?
它在java 8中工作。 – ZhongYu
@ bayou.io:虽然我接受它的工作原理,但我不明白为什么。与数组不同,泛型在Java中从来都不是协变的。教条是阵列是协变和物化的;泛型是不变的,被删除。 “列表”绝不应该是“列表”的子类型。 –
scottb
@scottb - 在java5-7中,这种情况下的类型推断只查看参数类型。 Java8改进了类型推断并考虑了更多的约束,在这种情况下,分配类型; ''NameValuePair>'被推断为'asList' – ZhongYu