Java ArrayList的?扩展接口

Jas*_*son 2 java generics collections interface arraylist

我有一组类都实现了具有该方法的验证接口isValid().我想把一组对象 - 所有不同的类 - 放入一个ArrayList中,循环遍历它们并调用isValid()每个对象.

这是我的代码

Email email = new email();
Address address = new Address();

ArrayList<? extends Validation> myValidationObjects = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

但是当我尝试做的时候:

myValidationObjects.add(email);
Run Code Online (Sandbox Code Playgroud)

我明白了:

方法add(捕获#2-of?extends Validation)在ArrayList类型中不适用于参数(Email)

双方EmailAddress实施验证.

根据这个文档,我应该可以extends用于接口和子类.

Mar*_*nik 6

List<? extends Validation> myValidationObjects

阅读不正确

myValidationObjects是扩展对象的列表Validation。”

正确阅读

myValidationObjects可以是任何扩展类型的列表Validation。例如,可以是a List<RangeValidation>或a List<RegexValidation>。”

由于没有对象,您可以合法地添加到a List<RangeValidation>和a中List<RegexValidation>,因此Java禁止您调用add此类变量。

实际上,您的情况比较简单:您需要定型List<Validation>


jlo*_*rdo 5

您可以使用:

List<Validation> myValidationObjects = new ArrayList<>();           // Java 7
List<Validation> myValidationObjects = new ArrayList<Validation>(); // pre Java 7
Run Code Online (Sandbox Code Playgroud)

现在,您可以添加实现Validation该列表的类的任何实例.