假设以下课程
public class Message {
// some code
}
Spring Validator实现(不需要Spring知识)
public class MessageValidator implements Validator {
public boolean supports(Class clazz) {
if(clazz.isAssignableFrom(Message.class))
return true;
else if(<ANSWER>)
return true;
return false;
}
public void validate(Object command, Errors errorArray) {
if(command instanceof List)
for(Message message: (List) command)
validateMessage(message);
else
validateMessage((Message) command);
}
public void validateMessage(Message message, Errors errorArray) {
// do validation Message object
}
}
通知支持方法。放入什么&lt; ANSWER&gt;为了支持消息列表 - 列表&lt;消息&gt; ?
的问候,
答案 0 :(得分:3)
通常类型参数信息(大部分)不会在运行时保留,因此您无法轻松访问它。基本上,即使它说List<Message>
它仍然可以是List<String>
。没有检查所有元素就无法区分这两者。
你能做的最好的事情就是看它是否实现了List
。欢迎输入类型擦除。
答案 1 :(得分:0)
值得记住以下区别:
对象没有泛型类型。实际的List
实例只是一个直的ArrayList
,或LinkedList
,或者其他什么。对象本身没有泛型类型,也不关心泛型。
变量通常被声明。因此,您将该对象引用为List<Foo>
。这允许编译器强制执行类型安全,但您真正要说的是,您希望将(无类型)List
作为Foo
列表,并且你要求编译器阻止你进行插入Bar
的调用(例如)。
泛型只是在现有对象之上构建的编译时“技巧”,因此在运行时检查对象是否是List<Foo>
的实例是没有意义的 - 它只是{{1的实例}}。此外,运行时检查不会为您带来任何好处,因为如果在编译时无法检查它,那么无论如何都不会从泛型中获益。