【问题标题】:ArrayList<T> with different types for TArrayList<T> 具有不同类型的 T
【发布时间】:2013-09-16 09:58:03
【问题描述】:
我想要一个具有不同但相似类型的列表。
例如,我想将不同验证器类的列表放在一个列表中。
例如:
ArrayList<T> validators = new ArrayList<T>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
这可能吗?
【问题讨论】:
标签:
java
templates
generics
arraylist
【解决方案1】:
下面是一个完整的例子:
首先,定义一个接口:
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();
}
}
}
【解决方案2】:
如果你只是想添加,那么
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 extendsValidator`。阅读generics wildcard operator here
【解决方案3】:
是的,如果验证器共享一个超类,您可以将其作为类型提供。
List<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
这里的许多答案都将第一种类型指定为<? extends Validator>,但这是不必要的。它允许您将第二种类型指定为 Validator 子类,即
List<? extends Validator> validators = new ArrayList<ValidatorSubClass>();
【解决方案4】:
创建一个名为Validator的超类,并让StringValidator和IntegerValidator扩展(或实现)Validator,然后你可以像这样初始化你的ArrayList:
ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
【解决方案5】:
是的,你总是可以这样做:
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,那么你可以将StringValidator和IntegerValidator添加到ArrayList
【解决方案6】:
根据Generics tutorial,可以使用
List<? extends Validator> validators = new ArrayList<>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
其中StringValidator 和IntegerValidator 扩展Validator。