【问题标题】:co-variance using Arrays.asList in java?在 java 中使用 Arrays.asList 的协方差?
【发布时间】:2015-11-22 14:17:27
【问题描述】:

当我创建一个列表时,我希望能够热切地初始化它;所以我使用了Arrays.asList。然而,它似乎在继承方面不是协变的。

例如,

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

不起作用(BasicNameValuePairNameValuePair 的派生类)。

虽然可以照常使用add

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

由于库 API 仅接受 List&lt;NameValuePair&gt; 类型作为其参数,因此我必须以这种方式定义 pairs。有什么方法可以优雅地处理这个问题?

【问题讨论】:

  • @bayou.io:虽然我接受它有效,但我不明白为什么。与数组不同,泛型在 Java 中从来就不是协变的。教条是数组是协变和具体化的。泛型是不变的和被擦除的。 List&lt;Subtype&gt; 绝不应该是 List&lt;ParentType&gt; 的子类型。
  • @scottb - 在 java5-7 中,这种情况下的类型推断只查看参数类型。 Java8 改进了类型推断并考虑了更多约束,在这种情况下是赋值类型; &lt;NameValuePair&gt; 推断为 asList

标签: java list types


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果我理解您的问题,那么我相信您可以在对Arrays.asList 的方法调用中使用显式1 泛型类型

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

    1Generic Methods (The Java Tutorials)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 2011-02-09
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2014-05-31
      相关资源
      最近更新 更多