簡體   English   中英

Java泛型類可以在實例化時自動確定類型嗎

[英]Can java generic class automatically determing type at instantiation

我有一個通用類:

public class ResultCard<T extends Bike>

private T bike;

public ResultCard(T bike)
{
    this.bike = bike;
}

public int someMethod()
{
     bike.showSpeed();
}

然后我有幾個班級擴展了Bike。 當我測試ResultCard bean時,我很驚訝地可以在不指定類型的情況下實例化它:

ResultCard resultCard = new ResultCard(bikeType);

並且以下調用有效:

resultCard.someMethod();

我認為ResultCard會以Object類型作為其泛型進行實例化,因為在實例化時未指定它,然后對someMethod()的調用會引發編譯時錯誤? 但是那沒有發生。 好像它從我的構造函數中確定類型一樣?

實例化bean時未指定泛型類型有什么問題嗎? 我誤會了嗎?

謝謝。

當具有類型綁定的通用類型參數時,如ResultCard<T extends Bike> ,在編譯過程中,類型參數將由綁定替換。 創建原始類型new ResultCard(...)或參數化類型new ResultCard<SomeBike>(...)的實例都沒關系。 編譯后,結果將相同。

僅當刪除類型綁定時,type參數才會按預期被Object替換。

您看到的是所謂的原始類型 它的行為接近ResultCard<Bike> ,但是您需要了解一些陷阱 (請參閱第36頁)。 例如,如果您在此類的任何重載方法中使用了泛型,例如int addNotes(Collection<Object> notes)void addNotes(List<Note> notes) ,則這兩個將變成int addNotes(Collection notes)void addNotes(List notes) ,這很可能會改變分辨率的工作方式。

另外,由於原始類型缺少其他類型信息,因此依賴於通用技巧的代碼將無法編譯。 例如,類Class<T>是用其表示的類參數化的泛型類。 結果,您可以定義將Class<T>的實例作為參數並返回T ,知道這是您傳遞的同一類。 如果將其保存到Class類型(沒有類型參數)的變量中 ,則方便的代碼將無法以某種晦澀的方式進行編譯。

由於在實例化時尚未指定通用類型,因此它是原始類型。

創建參數化類型的ResultCard

ResultCard<Bike> resultCard= new ResultCard<Bike>();

如果省略實際類型參數,則創建一個原始類型

ResultCard rawResultCard = ResultCard();

因此,ResultCard是通用類型ResultCard的原始類型。您始終可以將rawtype用於通用類型。

你知道嗎!!!! 我們沒有將List類作為通用類,但是經過一段時間后,它獲得了對通用List。的支持,因此為了向后兼容,仍然可以使用List。

在這里,您已經指定了准類型,它允許使用Bike Class參數實例化它,還允許調用該方法。

但是如果不是其他類不能擴展Bike類,那么它將給出編譯時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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