2

我想要一个具有不同但相似类型的列表。例如,我想将不同验证器类的列表放在一个列表中。

例如:

ArrayList<T> validators = new ArrayList<T>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

这可能吗?

4

6 回答 6

4

这是一个完整的示例,说明如何执行此操作:

首先,定义一个接口:

public interface Validator {
    void validate();
}

然后,创建一个实现:

public class IntegerValidator implements Validator {

    public void validate() {
        // Validate
    }
} 

字符串验证器实现:

public class StringValidator implements Validator {
    public void validate() {
        // Validate
    }
}

这是客户端代码:

public class Test {

    public static void main(String[] args) {
        List<Validator> v = new ArrayList<Validator>();
        v.add(new StringValidator());
        v.add(new IntegerValidator());

        for (Validator validator : v) {
            validator.validate();
        }
    }
}
于 2013-09-16T10:08:06.847 回答
4

如果你只想添加,那么

ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

很好。但是如果你想让你的子类类型被超类类型引用,那么

ArrayList< ? extends Validator> validators = new ArrayList<Validator>(); where all your validators extends如果您想使用超类引用来引用 Validator 的子类,请使用Validator。在此处阅读有关泛型通配符运算符的信息

于 2013-09-16T10:00:01.943 回答
4

是的,如果验证器共享一个超类,您可以将其作为类型提供。

List<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

这里的许多答案都将第一种类型指定为,<? extends Validator>但这是不必要的。它将允许您将第二种类型指定为 Validator 子类,即

List<? extends Validator> validators = new ArrayList<ValidatorSubClass>();
于 2013-09-16T10:00:22.660 回答
2

创建一个名为 Validator 的超类,并让 StringValidator 和 IntegerValidator 扩展(或实现)Validator,然后你可以像这样初始化你的 ArrayList:

ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
于 2013-09-16T10:03:12.703 回答
1

根据泛型教程,您可以使用

List<? extends Validator> validators = new ArrayList<>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

在哪里StringValidatorIntegerValidator扩展Validator

于 2013-09-16T10:07:44.387 回答
1

是的,你总是可以这样做:

ArrayList<object> validators = new ArrayList<object>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

在你的情况下

ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

你看,当你声明什么时,T只有你声明的类或扩展类可以放在ArrayList. 所以当你声明一个共同的父母时,你Validator可以添加 botchStringValidatorIntegerValidatorArrayList

于 2013-09-16T10:00:31.240 回答