深入理解JAVA虚拟机 程序编译和代码优化

泛型类型擦除

C#中的泛型,不论是代码中,还是编译后,还是运行期,都是切实存在的。List<String>和List<Int>是两个截然不同的类型,有自己的虚方法表和类型数据,这种实现称为类型膨胀。

Java中的泛型是编译之后就消失了。只在代码中存在。

当泛型遇见重载

  1. public class OverloadTest {
  2.     public void testType(List<String> list) {
  3.     System.out.println("String....");
  4. }
  5.  
  6. public void testType(List<Integer> list) {
  7.     System.out.println("Integer....");
  8. }
  9. }

这连个方法重载是失败的,但是我们知道java的泛型是伪泛型,编译之后类型都被擦除了,因此这段代码不能通过编译,因为String类型和Integer类型被擦除之后,两个方法是一样的。

  1. public class OverloadTest {
  2.     public String testType(List<String> list) {
  3.     System.out.println("String....");
  4.     return "";
  5. }
  6.  
  7. public int testType(List<Integer> list) {
  8.     System.out.println("Integer....");
  9.     return 1;
  10. }
  11. }

虽然返回值不能作为方法签名,但是这两个方法是可以编译通过的。这是java编译器的特殊处理。因为在class文件格式中,只要描述符不是完全一致的两个方法就可以共存。也就是两个方法如果有相同的名称和特征签名,但是返回值不同它们就可以合法的共存于一个class文件之中。

posted on 2017-07-01 23:59  张小贱1987  阅读(202)  评论(0编辑  收藏  举报

导航