[英]How to get constructor of a class with a generic parameter in the constructor
[英]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.