我将私有变量声明为
private List<MultipartFile> files;
当我想要初始化时,我这样做:
files=new ArrayList<CommonsMultipartFile>();
你可以看到CommonsMultipartFile扩展了MultipartFile接口 编译给我错误:
Type mismatch: cannot convert from ArrayList<CommonsMultipartFile> to List<MultipartFile>
任何知道原因的人? 如果我真的想要Stable集合和类内部类型,我该怎么办呢? 我可以用C ++做类似的工作吗?
答案 0 :(得分:4)
如果我没记错,在java泛型中:
如果您有两个课程A
,课程B extends A
和通用class Generic<T>
,则Generic<B>
不会延伸Generic<A>
。这就是你的演员无效的原因。
您可以将files
声明为:
private List<? extends MultipartFiles> files;
有了这个,你应该可以完成任务。
编辑:正如在其他回复中所述,此声明会阻止添加除null
之外的其他内容。实际上利益有限......
答案 1 :(得分:4)
继承原则不适用于类型参数。
List<MultipartFile> files=new ArrayList<MultipartFile>();
=&GT;完全有效。
List<MultipartFile> files=new ArrayList<CommonsMultipartFile>();
=&GT;完全错了。
为什么编译器不允许这样做?
假设您创建了ArrayList<CommonsMultipartFile>
,您可能会只拥有CommonsMultipartFile
元素。直到那里才出人意料。
如果编译器允许您将此ArrayList
指定为List<MultipartFile>
作为参考类型,则无法阻止您使用ArrayList
扩展MultipartFile
的某些对象填充CommonsMultipartFile
,甚至不同来自CommonsMultipartFile
!
问题是您最初预计只有private List<? extends MultipartFiles> files
元素。
所以java语法不会出现这样的惊喜......
此外,执行此操作? extends
可以,但逻辑上会阻止您将某些对象添加到其中,原因与我解释的相同!请注意,因为它经常被误解。
如果您想在之后使用此引用类型添加private List<? super CommonsMultipartFile>
个对象,则不希望使用CommonsMultipartFile
通配符。
无论如何,由于您只分配ArrayList
个CommonMultipartFile
个对象,因此层次结构中没有更高的对象,因此在这种情况下最合适的语法是:
List<MultipartFile> files=new ArrayList<MultipartFile>();
答案 2 :(得分:0)
如果您希望能够将列表与MultipartFile的任何子类型一起使用,请同时使用两个通用参数MultipartFile。如果您只想将它与CommonsMultipartFile一起使用,请将两个参数CommonsMultipartFile。在不太可能的情况下,您从未通过此引用将任何内容放入此列表中,您可以改为:
List<? extends MultipartFile> files = ...
您可以从列表中获取项目,它们将始终是MultipartFile的子类型,但您只能添加null。