这句话的意思是什么?Collection<? extends E> c

8

有时候,文档中出现了很多次这个东西。这让我不知道该输入什么。能否用通俗易懂的语言解释一下它的含义呢?是这样的:

ArrayList(Collection<? extends E> c)

最终被用作这样:
new ArrayList<>(Arrays.asList("a","b","c"));

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


5
请查看Oracle关于泛型的教程。 你可能需要阅读整个章节,因为Java中的泛型可能会非常混乱。此外,请查看PECS记忆技巧 - Turing85
2个回答

14

? extends E的语法意味着“某个类型既是E,或者是E的子类型”。?是一个通配符。

代码Arrays.asList("a","b","c")被推断为返回List<String>,而new ArrayList<>使用了钻石运算符,因此它产生了一个ArrayList<String>

通配符允许你推断出一个子类型--你可以将其分配给具有超类型的引用变量:

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

这里,E 被推断为 CharSequence 而不是 String,但这可以工作,因为 StringCharSequence 的一个子类型。


谢谢,理解+1 - Josephus87
“某种类型,它要么是 E 类型本身,要么是 E 类型的子类型。” Collection<? extends E> c 和仅写 Collection c 有何不同? - Arun Gowda

0
List<String> testList1 = new ArrayList<>(Arrays.asList("a","b","c"));

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

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

FYI:Arrays.asList(arrAgument); 这将创建一个不可变/不可修改的列表。由于底层的String数组长度无法在运行时更改,因此无法通过添加或删除项目来更改它。如果尝试添加或删除,则会在运行时抛出java.lang.UnsupportedOperationException异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接