[英]Specifying a generic type in java from Class object
為什么這是錯誤的:
Class<? extends Number> type = Integer.class;
ArrayList<type> = new ArrayList<>();
?
給定一個類對象,沒有辦法實例化特定類型的類嗎?
顯然,我永遠不會直接這樣做,這只是顯示所需內容的一個示例。 在實際代碼中,我需要不知道類型的名稱。 例如
public void createAList(Class<? extends Number> type)
{
ArrayList<type> toReturn = new ArrayList<>();
return toReturn;
}
<T extends Number> ArrayList<T> createAList(Class<T> type)
{
ArrayList<T> toReturn = new ArrayList<>();
return toReturn;
}
ArrayList<Integer> intList = createAList(Integer.class);
那不是您使用泛型的方式。 您不使用Class
對象,而是直接在代碼中使用類名稱。
ArrayList<Integer> = new ArrayList<>();
感覺到java 類 (實際上也是通用的)對象和類名之間的區別。
您應該使用類名稱指定通用類型。
ArrayList<Number> = new ArrayList<>();
// ArrayList<Number.class> = new ArrayList<>(); <- WRONG
如果僅在運行時知道類型,請使用此方法:
public <T extends Number> void createAList(Class<T> type) {
ArrayList<T> toReturn = new ArrayList<>();
return toReturn;
}
ArrayList<>
必須具有其持有的特定類型。 您可以在其中放置該類型或任何子類型的對象。
所以用
List<Number> = new ArrayList<Number>();
你可以把Integers
請注意,我是如何使用等號左側的接口和右側的類的。 這是最佳做法。
如果您想要一個僅包含Integer
的列表(按照您的示例),那么@irreputable的答案是最好的選擇。 此答案將保留Integer
,而不僅僅是Integer.
從字面上看,其他答案關於如何實現createAList
的建議都忽略了一些重要的事情:由於類型擦除 ,這種方法毫無意義。
如果您想要一個List<? extends Number>
List<? extends Number>
,您可以這樣編寫:
List<? extends Number> lst = new ArrayList<>();
如果您只想要List<?>
,則可以編寫:
List<?> lst = new ArrayList<>();
如果您在類型參數T
的范圍內,並且想要List<T>
,則可以編寫:
List<T> lst = new ArrayList<>();
注意, Class
對象與這些構造函數調用無關,就像其他答案中的方法一樣。 這是因為在運行時, ArrayList
實例不知道或不在乎其引用在運行時具有的通用類型。
您甚至不需要傳遞參數:
public <T extends Number> ArrayList<T> createAList () {
return new ArrayList<T>();
}
盡管在調用時可能需要顯式指定type參數:
ArrayList<Integer> intList = this.<Integer>createAList();
ArrayList<type> = new ArrayList<>();
這條線是錯誤的。 首先,您在這里錯過了標識符(變量名); 其次,您混合了“類型”和“類”的概念。 你可以delcare
ArrayList<Integer> list = new ArrayList<>();
但是根據您的輸入,請type = Integer.class
。 顯然, Integer
不等同於Integer.class
。 同樣,您不能擁有Integer.class i = 1;
前一個是“類型”,第二個是“類”對象。
您可以創建一個通用方法:
public <T extends Number> List<T> createAList (Class<T> type) {
return new ArrayList<T>();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.