qq_35242008 2016-06-10 17:15 采纳率: 100%
浏览 2111
已采纳

java泛型擦除原因,何为迁移兼容性

看了thinking in java 里的泛型篇,搞不懂里面讲的泛型的核心动机是迁移兼容性,为了使泛化客户端能够使用非泛化库类,反之亦然。
作者分别了向后兼容性和迁移兼容性,可是没用例子说明什么样是迁移兼容性,能举个例子说明一下如果泛型不擦除,就无法迁移代码吗?十分感谢!

  • 写回答

3条回答 默认 最新

  • (def p []) 2016-06-13 13:54
    关注

    1、你要理解java编译和解释执行的过程。在各过程中,范型的存在性、存在方式、被处理方式。
    2、编译器编译源代码时,会检查范型,防止类型出错。
    例如:List usernames = new ArrayList();将不能通过编译。
    它将源代码编译为字节码,这时候的字节码,与没有使用范型编译过来的字节码比较,多出了一些范型信息。
    但是这些范型信息的有无,对于JVM是一样的(如果不考虑反射)。
    List usernames = new ArrayList();
    Object o = usernames;
    List ints = (List)o;//warning
    usernames.add("avril lavigne");
    ints.add(100);
    以上代码,ints和usernames指向同一个列表,但是却可以添加字符串和整型对象。
    这段代码应该会加深你对范型的理解。
    3、 对“拭去法”的理解,并不只是简单的将范型信息擦出。
    public class Hello {
    T t;
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
    Type[] types = Hello.class.getTypeParameters();
    System.out.println(types[0]);
    Hello h = new Hello<>();
    h.t = "";
    h.getClass().getDeclaredField("t").set(h, 1);;
    System.out.println(h.t);
    }
    }
    这段代码通过编译,并输出
    T
    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at generic.Hello.main(Hello.java:13)
    也就是说,字节码被载入jvm后,字段的类型仍然保持为T。这也验证了范型是参数化类型的说法。
    如果再加两行代码
    Hello h2 = new Hello<>();
    h2.t = (Integer)(Object)h.t;
    也将通过编译,然而运行却报异常。
    说明在实例化对象的时候,动态的将字段的类型进行了设定,和的信息对运行时产生了影响!!!
    同一个类型实例化的对象,相同的属性类型却不能匹配!!!
    有范型和没范型,编译得到的字节码有本质的不同。jvm载入后,类中含有参数化类型。
    这个类型化参数,是在运行时动态绑定的!
    范型没有被拭去?是的。"拭去法"并不能简单的理解。
    更准确的理解应该是,编译时,对于类定义,范型作为类型的参数化信息,并不决定类型。
    拭去,指的是在类定义时,范型不决定被定义类的类型,而不是指范型信息被擦除!范型信息仍然是该类的一部分!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)
  • ¥15 无法使用此凭据登录,因为你的域不可用,如何解决?(标签-Windows)
  • ¥15 yolov9的训练时间
  • ¥15 二叉树遍历没有报错但无法正常运行
  • ¥15 在linux系统下vscode运行robocup3d上场球员报错
  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动