我想要一个具有不同但相似类型的列表。 例如,我想在一个列表中放入不同验证器类的列表。
例如:
ArrayList<T> validators = new ArrayList<T>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
这可能吗?
答案 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
这样的公共父级时,您可以将StringValidator
和IntegerValidator
添加到ArrayList
答案 5 :(得分:1)
根据Generics tutorial,您可以使用
List<? extends Validator> validators = new ArrayList<>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
其中StringValidator
和IntegerValidator
延伸Validator
。