2012-10-23 189 views
1

當類型信息由於擦除而在運行時不可用時,java編譯器如何知道如何爲泛型集合中的對象提供適當的轉換?Java泛型類型擦除鑄造

+0

只能在編譯時發生。 – OldCurmudgeon

+0

編譯器在編譯時由_generated_進行強制轉換。他們在運行時_happen_。 – mhsmith

回答

0

按照神諭tutorial

  • 如果類型參數是無限的替換泛型類型與他們的界限或對象的所有類型參數。因此,生成的字節碼只包含普通的類,接口和方法。
  • 如果需要,插入類型可以保護類型安全。
  • 生成橋接方法以保留擴展泛型中的多態性。

所以,你的類文件包含無論是有界類(或)對象,而不是泛型類型。

+0

但是列表 list = new ArrayList 這將被替換爲List list = new ArrayList();那麼編譯器在從列表中檢索對象時需要知道對象類型是否需要轉換爲字符串? – Phoenix

+0

看到這個線程可能會清除你的困惑。在字節代碼級別,.class文件存儲一些通用信息,這些信息可以使用關鍵字進行處理。 http://stackoverflow.com/questions/937933/where-are-generic-types-stored-in-java-class-files – kosa

1

每當你打電話給list.get(foo),並且該列表是ArrayList<String>,那麼get的結果由調用者轉入String,而不是被調用者。調用者在編譯時知道結果應該投到什麼地方(一個String),所以可以將演員插入到那裏。