0

我将私有变量声明为

private List<MultipartFile> files;

当我想初始化它时,我这样做:

files=new ArrayList<CommonsMultipartFile>();

你可以看到 CommonsMultipartFile 扩展了 MultipartFile 接口编译给我的错误是:

Type mismatch: cannot convert from ArrayList<CommonsMultipartFile> to List<MultipartFile>

有谁知道原因吗?如果我真的想稳定集合和内部类类型,我该怎么做?我可以在 C++ 中做类似的工作人员吗?

4

3 回答 3

4

继承原则不适用于类型参数。

List<MultipartFile> files=new ArrayList<MultipartFile>();

=> 完全有效。

List<MultipartFile> files=new ArrayList<CommonsMultipartFile>();

=> 完全错误。

为什么编译器不允许这样做?

假设您创建一个ArrayList<CommonsMultipartFile>,您希望只有CommonsMultipartFile元素。没有惊喜,直到那里。

如果编译器允许您将其分配ArrayListList<MultipartFile>作为引用类型,则没有什么可以阻止您ArrayList使用一些扩展MultipartFile甚至不同于CommonsMultipartFile!

问题是您最初期望只有CommonsMultipartFile元素。

所以java语法不会让这样的惊喜出现……

此外,这样做private List<? extends MultipartFiles> files是可行的,但在逻辑上会阻止您将某些对象添加到其中,原因与我解释的相同!对此要小心,因为它经常被误解。

如果您想在之后使用此引用类型在其中添加对象? extends,您将更愿意使用通配符而不是通配符。private List<? super CommonsMultipartFile>CommonsMultipartFile

无论如何,由于您仅分配ArrayListwithCommonMultipartFile对象,因此层次结构中没有更高的对象,因此在这种情况下最合适的语法是:

List<MultipartFile> files=new ArrayList<MultipartFile>();
于 2012-10-04T11:46:45.517 回答
4

如果我没记错的话,在java泛型中:

如果你有两个类A,一个类B extends A和一个泛型class Generic<T>,那么Generic<B>就不用extends Generic<A>。这就是为什么你的演员不起作用。

您可以声明files为:

private List<? extends MultipartFiles> files;

有了这个,你应该能够完成你的任务。

编辑:正如在其他回复中所说,此声明将阻止添加除null. 确实是兴趣有限...

于 2012-10-04T11:43:26.130 回答
0

如果您希望能够将列表与 MultipartFile 的任何子类型一起使用,请将两个通用参数设为 MultipartFile。如果您只想将它​​与 CommonsMultipartFile 一起使用,请将两个参数都设为 CommonsMultipartFile。在极少数情况下,您从未通过此引用将任何内容放入此列表,您可以改为:

List<? extends MultipartFile> files = ...

您可以从列表中获取项目,它们始终是 MultipartFile 的子类型,但您只能添加 null。

于 2012-10-04T11:50:57.883 回答