簡體   English   中英

如何從Class對象獲取泛型?

[英]How can i get generic type from a Class object?

假設下面的類

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
    }

}

通知支持方法。 為了支持消息列表-List <Message>,在<ANSWER>中放置了什么?

問候,

泛型類型參數信息在大多數情況下不會在運行時保留,因此您沒有簡便的方法來訪問它。 基本上,即使它說List<Message>它仍然可以是List<String> 如果不檢查所有元素,就無法將兩者區分開。

最好的辦法就是查看它是否實現List 歡迎輸入擦除。

值得記住以下區別:

對象沒有泛型類型。 實際的List實例只是一個簡單的ArrayListLinkedList或其他任何東西。 對象本身沒有泛型類型,也不關心泛型。

另一方面, 變量是通用聲明的。 因此,您將對象引用為List<Foo> 這允許編譯器強制類型安全,但你真正想說的是,你要治療 (無類型) List作為列表Foo ,和你問的編譯器從會插入打電話阻止你Bar s(例如)。

泛型只是在現有對象之上構建的編譯時“技巧”,因此在運行時檢查對象是否為List<Foo>的實例沒有意義-它只是List的實例。 此外,運行時檢查不會給您帶來任何好處,因為如果無法在編譯時進行檢查,那么無論如何您都不會從泛型中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM