【问题标题】:What exactly does this mean Collection<? extends E> c这到底是什么意思 Collection<?扩展 E> c
【发布时间】:2016-02-06 21:28:07
【问题描述】:

有时,很多时候,我在文档中看到了这种情况。这让我想知道要输入什么。有人可以用清晰的模糊文本向我解释这个的含义:D。这是怎么回事:

ArrayList(Collection<? extends E> c)

最终被这样使用:

new ArrayList<>(Arrays.asList("a","b","c"));

所以我不再需要通过谷歌搜索来问这个“问题”,而是能够自己弄清楚。

【问题讨论】:

标签: java javadoc


【解决方案1】:

语法? extends E 的意思是“某种类型,要么是E,要么是E 的子类型”。 ? 是通配符。

推断代码Arrays.asList("a","b","c") 会返回List&lt;String&gt;,而new ArrayList&lt;&gt; 使用菱形运算符,因此会产生ArrayList&lt;String&gt;

通配符允许您推断子类型——您可以将其分配给具有超类型的引用变量:

List<CharSequence> list = new ArrayList<>(Arrays.asList("a","b","c"));

在这里,E 被推断为 CharSequence 而不是 String,但这是可行的,因为 StringCharSequence 的子类型。

【讨论】:

  • 谢谢理解+1
  • “某种类型是 E 或 E 的子类型”Collection&lt;? extends E&gt; c 与仅写 Collection c 有何不同?
【解决方案2】:
List<String> testList1 = new ArrayList<>(Arrays.asList("a","b","c"));

此语句创建一个全新的 ArrayList 对象,其中包含与使用 Arrays.asList("a","b","c") 生成的列表相同的元素。

因此,新的ArrayList和原来的String列表是完全独立的对象。

仅供参考:Arrays.asList(arrAgument); 这将创建一个不可变/不可修改的列表。我们无法通过添加或删除项目来更改,因为基础字符串数组的长度无法在运行时更改。如果您尝试添加或删除 java.lang.UnsupportedOperationException 将在运行时抛出。

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多