2014-01-28 96 views
0

我有一個方法Java:如何確定抽象類型的具體類型?

public static Set<MyClass> doSomething(Set<MyClass> oldSet) { 

    //I don't necessarily want this to be a HashSet 
    Set<MyClass> newSet = new HashSet<MyClass>(); 

    //Add some things to newSet 

    return newSet; 
} 

有什麼辦法,我可以返回相同的具體類型,在設定的通過? (不必返回oldSet)。不幸的是,集合不能被克隆。

如果oldSet是一個TreeSet,我也想返回的集合(newSet)是一個TreeSet。

+3

你的問題並不清楚,至少對我而言。請改善 – Keerthivasan

+0

我已經添加了一個例子 - 這樣更好嗎? –

+0

阿列克謝的回答是完美的 – Keerthivasan

回答

5

嘗試

Set<MyClass> doSomething(Set<MyClass> oldSet) { 

    Set<MyClass> newSet =oldSet.getClass().newInstance(); 

    return newSet; 
} 

這隻能如果具體類oldSet有沒有參數的構造函數。

+1

所有集合應該有這樣一個構造函數,根據'Collection' JavaDoc:>>>「所有通用集合實現類...應該提供兩個」標準「構造函數:void(無參數)構造函數,...以及一個帶有一個Collection類型的單個參數的構造函數,它創建一個與它的參數具有相同元素的新集合。「<<<。 – Marco13

1

是,使用反射:

Class<? extends Set<MyClass>> type = oldSet.getClass(); 
Constructor ctor = type.getConstructor(); 
Set<MyClass> newSet = ctor.newInstance(); 

(從我的頭頂,你就必須添加幾個類型和一噸的異常處理程序)。

您也可以克隆集:

Class<? extends Set<MyClass>> type = oldSet.getClass(); 
Constructor ctor = type.getConstructor(Collection.class); 
Set<MyClass> newSet = ctor.newInstance(oldSet); 
0

你可以通過設置,克隆組中的每個對象,並把它變成新的設定。這是假設MyClass是可複製的。