Java Collections通配符

use*_*360 3 java generics

我试图定义一个List对象,然后使用下面的代码向它添加对象:

List<? extends File> newFiles = new ArrayList<? extends File>();
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样定义它时,我得到编译器错误

无法实例化该类型 ArrayList<? extends File>

List<? extends File> newFiles = new ArrayList<File>()
Run Code Online (Sandbox Code Playgroud)

似乎是有效的.目前尚不清楚为什么.

File是我创建的bean对象 - 而不是属于Java API的对象.

Mak*_*oto 6

您无法直接实例化通配符类型.在这种情况下,那将是? extends File.

你可以做的只是使用File,因为extends暗示一个上限关系(你保证该集合中的元素至少是 File)...

List<? extends File> newFiles = new ArrayList<File>();
Run Code Online (Sandbox Code Playgroud)

...或者您可以在Java 7+中使用钻石符号,这在当今更为惯用.

List<? extends File> newFiles = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

经过一番重新思考,您确定要通配符吗?对于泛型,如果你使用绑定类型,要记住的规则是PECS - Producer Extends,Consumer Super.作为一个制作人,尽管该列表是空的,但该列表不能再被添加到任何列表中.

为您的用例完全取消泛型类型绑定可能更好.