深入理解JAVA虚拟机 程序编译和代码优化
泛型类型擦除
C#中的泛型,不论是代码中,还是编译后,还是运行期,都是切实存在的。List<String>和List<Int>是两个截然不同的类型,有自己的虚方法表和类型数据,这种实现称为类型膨胀。
Java中的泛型是编译之后就消失了。只在代码中存在。
当泛型遇见重载
-
public class OverloadTest {
-
public void testType(List<String> list) {
-
System.out.println("String....");
-
}
-
-
public void testType(List<Integer> list) {
-
System.out.println("Integer....");
-
}
-
}
这连个方法重载是失败的,但是我们知道java的泛型是伪泛型,编译之后类型都被擦除了,因此这段代码不能通过编译,因为String类型和Integer类型被擦除之后,两个方法是一样的。
-
public class OverloadTest {
-
public String testType(List<String> list) {
-
System.out.println("String....");
-
return "";
-
}
-
-
public int testType(List<Integer> list) {
-
System.out.println("Integer....");
-
return 1;
-
}
-
}
虽然返回值不能作为方法签名,但是这两个方法是可以编译通过的。这是java编译器的特殊处理。因为在class文件格式中,只要描述符不是完全一致的两个方法就可以共存。也就是两个方法如果有相同的名称和特征签名,但是返回值不同它们就可以合法的共存于一个class文件之中。
我们习惯用自己的行为准则审视他人,并时刻准备加以指摘。