我陷入了泛型向下轉換。因為我學習型別擦除。當代碼編譯時,所有引數化型別都將轉換為上限,如果未定義邊界,則它會更改為物件。創類
public class Gen<T>
{
T ob;
Gen(T o)
{
ob = o;
}
T getob()
{
return ob;
}
void showType()
{
System.out.println("Type of T is: " ob.getClass().getName());
}
}
GenDemo類
public class GenDemo
{
public static void main(String [] args)
{
Gen<String> strob = new Gen<String>("I am Ahmad");
String str = strob.getob();
System.out.println("Value of str is: " str);
}
}
字串 str = strob.getob(); 隱式轉換為字串。JVM 如何將 strob.getob() 轉換為 String。從 JVM 發現 strob.getob() 的位置向下轉換為字串。因為型別擦除將回傳型別更改為物件。所以在位元組碼中,getob() 的回傳型別是物件。但是當我呼叫 getob() 時,它會自動向下轉換為字串。所以我很困惑通用的向下轉換,請詳細解釋一下。
uj5u.com熱心網友回復:
是的,在運行時回傳型別strob.getob();基本上等同于 just Object。
但是,在編譯期間,編譯器會理解這strob是一個Gen<String>并確保添加了所有必要的低級操作。所以它基本上把那一行當作你寫的
String str = (String) strob.getob();
換句話說:它將為型別轉換生成位元組碼,即使在源代碼中找不到該型別轉換。
這也解釋了何時由于某種原因通用型別系統被破壞(基本上是通過使用未經檢查的強制轉換):如果由于某種原因 getob()實際上回傳了無法強制轉換的內容,String那么您將變得無聊ClassCastException,就像您嘗試過一樣投到。Integer_String
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437852.html
上一篇:使用forList的正確泛型
