簡體   English   中英

調用泛型參數的構造函數,或獲取Class對象(或為什么它不起作用?)

[英]call constructor, or get Class object, of generic parameter (or why doesn't it work?)

我現在開始喜歡Java了。

假設我想將一個對象添加到集合中; 無論收集類型如何。 通過使用泛型和T擴展Collection,將很容易。 但是,現在讓我們說,我也想通過創建一個新集合來處理我的集合為null的情況。 但我希望返回的集合是調用方法想要的類型。 所以像這樣:

public <T extends Collection<MyObject> addToCollection (Myobject object, T collection){
    if(collection==null)
        collection=new T();

    collection.add(object);

    return collection;
}

顯然我不能調用new T(),但是有一種等效的方法嗎? 通過反射,我可以做到,但是反射假定我知道T是什么類,並且如果collection為null,我不能直接調用“ collection.getClass()”。我的直覺是,由於編譯器無法推斷出此結果是不可能的方式; 從理論上講似乎只是可行的

如果我有一個方法可以說類似

HashSet<MyObject> set=addToCollection(object, null);

我可以在運行時看到,當我調用此集合時,我希望返回一個HashSet,因此從理論上講,我可以告訴該方法它期望T的類型,因此我的方法現在將創建什么集合。 我強烈認為Java不會這樣做。 但是,如果不是這樣的話,之所以不能實施該功能,是因為Sun / Oracle不會以這種方式來解決它,這是一個非常極端的情況。 還是編譯器與運行時交互的方式使這不可能或極端困難?

如果collection為null,則需要告訴您的方法要創建什么類型的collection。 為此,您可以將類作為參數傳遞。

public <T extends Collection<String>> T addToCollection(String object, T collection, Class<T> clazz) {
if (collection == null)
    collection = clazz.newInstance();

collection.add(object);

return collection;
}

編輯

如注釋中所指出的,需要注意的是, Class.newInstance()僅在構造函數具有零參數且已經可訪問時才會成功。 否則,必須使用Constructor.newInstance()

暫無
暫無

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

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