Java Collections通配符

时间:2015-07-28 19:53:43

标签: java generics

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

List<? extends File> newFiles = new ArrayList<? extends File>();

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

  

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

,而

List<? extends File> newFiles = new ArrayList<File>()

似乎有效。目前尚不清楚原因。

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

1 个答案:

答案 0 :(得分:6)

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

您可以做的只是使用File,因为extends意味着上限关系(您可以保证该集合中的元素位于最少 { {1}})...

File

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

List<? extends File> newFiles = new ArrayList<File>();

经过一些重新思考后,你确定你想要那个通配符吗?使用泛型,如果您使用绑定类型,要记住的规则是 PECS - 生产者扩展,消费者超级。作为制作人,尽管该列表是空的,但该列表无法进一步添加。

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