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