【发布时间】:2015-11-22 14:17:27
【问题描述】:
当我创建一个列表时,我希望能够热切地初始化它;所以我使用了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。有什么方法可以优雅地处理这个问题?
【问题讨论】:
-
@bayou.io:虽然我接受它有效,但我不明白为什么。与数组不同,泛型在 Java 中从来就不是协变的。教条是数组是协变和具体化的。泛型是不变的和被擦除的。
List<Subtype>绝不应该是List<ParentType>的子类型。 -
@scottb - 在 java5-7 中,这种情况下的类型推断只查看参数类型。 Java8 改进了类型推断并考虑了更多约束,在这种情况下是赋值类型;
<NameValuePair>推断为asList