java basic:模板只能接受一维更改为什么?

时间:2012-10-04 11:28:49

标签: java c++ templates

我将私有变量声明为

private List<MultipartFile> files;

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

files=new ArrayList<CommonsMultipartFile>();

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

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

任何知道原因的人? 如果我真的想要Stable集合和类内部类型,我该怎么办呢? 我可以用C ++做类似的工作吗?

3 个答案:

答案 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通配符。

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

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

答案 2 :(得分:0)

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

List<? extends MultipartFile> files = ...

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