我想要一个具有不同但相似类型的列表。例如,我想将不同验证器类的列表放在一个列表中。
例如:
ArrayList<T> validators = new ArrayList<T>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
这可能吗?
这是一个完整的示例,说明如何执行此操作:
首先,定义一个接口:
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();
}
}
}
如果你只想添加,那么
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。在此处阅读有关泛型通配符运算符的信息
是的,如果验证器共享一个超类,您可以将其作为类型提供。
List<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
这里的许多答案都将第一种类型指定为,<? extends Validator>
但这是不必要的。它将允许您将第二种类型指定为 Validator 子类,即
List<? extends Validator> validators = new ArrayList<ValidatorSubClass>();
创建一个名为 Validator 的超类,并让 StringValidator 和 IntegerValidator 扩展(或实现)Validator,然后你可以像这样初始化你的 ArrayList:
ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
根据泛型教程,您可以使用
List<? extends Validator> validators = new ArrayList<>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
在哪里StringValidator
和IntegerValidator
扩展Validator
。
是的,你总是可以这样做:
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
可以添加 botchStringValidator
和IntegerValidator
ArrayList