簡體   English   中英

從Class對象中指定Java中的泛型類型

[英]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

UPD:

如果僅在運行時知道類型,請使用此方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM