继承原则不适用于类型参数。
List<MultipartFile> files=new ArrayList<MultipartFile>();
=> 完全有效。
List<MultipartFile> files=new ArrayList<CommonsMultipartFile>();
=> 完全错误。
为什么编译器不允许这样做?
假设您创建一个ArrayList<CommonsMultipartFile>
,您希望只有CommonsMultipartFile
元素。没有惊喜,直到那里。
如果编译器允许您将其分配ArrayList
给List<MultipartFile>
作为引用类型,则没有什么可以阻止您ArrayList
使用一些扩展MultipartFile
甚至不同于CommonsMultipartFile
!
问题是您最初期望只有CommonsMultipartFile
元素。
所以java语法不会让这样的惊喜出现……
此外,这样做private List<? extends MultipartFiles> files
是可行的,但在逻辑上会阻止您将某些对象添加到其中,原因与我解释的相同!对此要小心,因为它经常被误解。
如果您想在之后使用此引用类型在其中添加对象? extends
,您将更愿意使用通配符而不是通配符。private List<? super CommonsMultipartFile>
CommonsMultipartFile
无论如何,由于您仅分配ArrayList
withCommonMultipartFile
对象,因此层次结构中没有更高的对象,因此在这种情况下最合适的语法是:
List<MultipartFile> files=new ArrayList<MultipartFile>();