2012-12-11 52 views
0

假設我有一個Type a這是一個java.util.TreeSet<T>,已通過泛型參數化,我們無法看到由於類型擦除。我們也有一個Type b,這是一個'java.lang.Integer'。我如何構建一個這是一個java.util.TreeSet<java.lang.Integer>給定一個ParameterizedType和一個類型,如何重新參數化第一個類型?

或者,如果它更容易,我們可以有一個原始的java.util.TreeSet類型來使用。

+0

問題是你想用Type和ParameterizedType對象做什麼。原則上,你可以通過對相應對象的反思來獲得這些信息。 – Jochen

+0

我根本不關心普通的'Type'對象。我需要'ParameterizedType'傳遞給gson來反序列化集合。 –

+0

這是一個重複的http://stackoverflow.com/questions/2989475/creating-parameterized-type-object-using-annonymous-class – Jochen

回答

1

像這樣實現ParameterizedType

public class MyParamType implements ParameterizedType { 
    private Type rawType; 
    private List<Type> paramTypes; 

    public MyParamType(Type raw) { 
    this.rawType = raw; 
    } 

    public void addParamType(Type t) { 
    paramTypes.add(t); 
    } 

    //for the interface methods, just return what you stored before 
} 

做或多或少同樣爲Type。 如果您需要更多關於Type實際上應該爲非泛型類型實現的提示(它只是一個標記接口),請查看JDK源代碼或查看調試器中的具體實例。

+0

太棒了。我得到了它的工作。非常感謝。 –

0

你給了你自己問題的一半答案。類型參數(在你的情況下是整型)是隻在編譯時存在的擦除。所以,如果你想創建Set<Integer>當您正在開發的代碼,你纔可以說:

Set<Integer> myset = new TreeSet<Integer>(); 

,或者如果你是幸運的Java 7的用戶更短:

Set<Integer> myset = new TreeSet<>(); 

但是這條線將被編譯以明碼:

Set myset = new TreeSet(); 

所以,如果你想在運行時創建的TreeSet<Integer>比如你只需要創建的純TreeSet例如,例如Class.forName(className).newInstance()。在這種情況下,類型參數Integer是無關緊要的。

編輯: 我只是讀了你的評論,並明白你爲什麼問。如果你真的想要你可以創建TreeSet的子類:class IntegerTreeSet extends TreeSet<Integer>。使用反射API可以發現IntegerTreeSet的參數類型。

該類可以靜態創建(只需在代碼中寫入)或動態使用Javassist或CGLIB等工具。

+0

我實際上並不想實例化它 - 我只是想要一個描述它的Type對象。 –

+0

關於你的編輯,我選擇Integer和TreeSet是任意的。 'ParameterizedType'可以描述任何集合,'Type'可以描述任何對象。 –

相關問題