我试图定义一个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的对象.
您无法直接实例化通配符类型.在这种情况下,那将是? 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.作为一个制作人,尽管该列表是空的,但该列表不能再被添加到任何列表中.
为您的用例完全取消泛型类型绑定可能更好.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |