具有T </t>的不同类型的ArrayList <t>

时间:2013-09-16 09:58:04

标签: java templates generics arraylist

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

例如:

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

这可能吗?

6 个答案:

答案 0 :(得分:4)

如果你只想添加,那么

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

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

如果要使用超类引用引用Validator的子类,请使用ArrayList< ? extends Validator> validators = new ArrayList<Validator>(); where all your validators extends Validator`。阅读generics wildcard operator here

答案 1 :(得分: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>();

答案 2 :(得分:4)

以下是完成如何操作的完整示例:

首先,定义一个接口:

public interface Validator {
    void validate();
}

然后,创建一个实现:

public class IntegerValidator implements Validator {

    public void validate() {
        // Validate
    }
} 

String验证器实现:

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();
        }
    }
}

答案 3 :(得分:2)

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

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

答案 4 :(得分: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这样的公共父级时,您可以将StringValidatorIntegerValidator添加到ArrayList

答案 5 :(得分:1)

根据Generics tutorial,您可以使用

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

其中StringValidatorIntegerValidator延伸Validator