如何从Class对象获取泛型类型?

时间:2009-09-08 02:10:33

标签: java generics spring spring-mvc

假设以下课程

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; ?

的问候,

2 个答案:

答案 0 :(得分:3)

通常类型参数信息(大部分)不会在运行时保留,因此您无法轻松访问它。基本上,即使它说List<Message>它仍然可以是List<String>。没有检查所有元素就无法区分这两者。

你能做的最好的事情就是看它是否实现了List。欢迎输入类型擦除。

答案 1 :(得分:0)

值得记住以下区别:

对象没有泛型类型。实际的List实例只是一个直的ArrayList,或LinkedList,或者其他什么。对象本身没有泛型类型,也不关心泛型。

另一方面,

变量通常被声明。因此,您将该对象引用为List<Foo>。这允许编译器强制执行类型安全,但您真正要说的是,您希望将(无类型)List作为Foo列表,并且你要求编译器阻止你进行插入Bar的调用(例如)。

泛型只是在现有对象之上构建的编译时“技巧”,因此在运行时检查对象是否是List<Foo>的实例是没有意义的 - 它只是{{1的实例}}。此外,运行时检查不会为您带来任何好处,因为如果在编译时无法检查它,那么无论如何都不会从泛型中获益。