2012-12-29 55 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