2012-12-29 58 views
2

我有一個重新編寫java泛型的quetion。 據我所知,一般的信息只能在編譯的時候,通過一個名爲「類型擦除」過程中的所有類型的信息 消失一旦代碼被編譯和.class文件是由java編譯器如何知道jar中代碼的泛型類型信息?

即一旦java文件是編譯後,列表myList = new arrayList(),即.class文件字節碼具有的內容,即使列表被聲明爲.java文件中的字符串列表。

話雖如此,考慮下面的情況。

我有一個方法,一個罐子簽名

public void check(List<String> p) 

當我把這個方法從另一個代碼,編譯器強制執行檢查方法的參數應該是List<String>而已,沒有別的。

現在,由於jar(.class文件)中存在檢查方法,如果在製作.class文件時TYPE信息 已被移除,編譯器如何知道List<String>所需的TYPE信息?

+0

你的問題不包含一個通用的例子...? –

回答

7

類型擦除不會刪除相關仿製藥的所有信息。簡而言之,所述方法的簽名(public void check(List<String> p))將被完整保留。 可以在運行時與反射API(像getGenericParameterTypes()getTypeParameters() &其它方法)獲得的保留信息。

+0

+1有一個在編譯器使用'class'文件的一般信息,它不使用它(除了反射) –

+0

@Piotr的JVM,所以它的種類等的信息在.class文件可用,JVM並沒有使用它,正如Peter所指出的那樣。 – Atul