假設我有一個Type a
這是一個java.util.TreeSet<T>
,已通過泛型參數化,我們無法看到由於類型擦除。我們也有一個Type b
,這是一個'java.lang.Integer'。我如何構建一個這是一個java.util.TreeSet<java.lang.Integer>
?給定一個ParameterizedType和一個類型,如何重新參數化第一個類型?
或者,如果它更容易,我們可以有一個原始的java.util.TreeSet
類型來使用。
假設我有一個Type a
這是一個java.util.TreeSet<T>
,已通過泛型參數化,我們無法看到由於類型擦除。我們也有一個Type b
,這是一個'java.lang.Integer'。我如何構建一個這是一個java.util.TreeSet<java.lang.Integer>
?給定一個ParameterizedType和一個類型,如何重新參數化第一個類型?
或者,如果它更容易,我們可以有一個原始的java.util.TreeSet
類型來使用。
像這樣實現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源代碼或查看調試器中的具體實例。
太棒了。我得到了它的工作。非常感謝。 –
你給了你自己問題的一半答案。類型參數(在你的情況下是整型)是隻在編譯時存在的擦除。所以,如果你想創建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等工具。
我實際上並不想實例化它 - 我只是想要一個描述它的Type對象。 –
關於你的編輯,我選擇Integer和TreeSet是任意的。 'ParameterizedType'可以描述任何集合,'Type'可以描述任何對象。 –
問題是你想用Type和ParameterizedType對象做什麼。原則上,你可以通過對相應對象的反思來獲得這些信息。 – Jochen
我根本不關心普通的'Type'對象。我需要'ParameterizedType'傳遞給gson來反序列化集合。 –
這是一個重複的http://stackoverflow.com/questions/2989475/creating-parameterized-type-object-using-annonymous-class – Jochen