<解惑>jvm如何理解java的jvm泛型类

 上面是一个很典型的泛型(generic)代码T昰类型变量,可以是任何引用类型

3、泛型约束和局限性—— 类型擦除所带来的麻烦

(1)  继承泛型类型的多态麻烦。(—— 子类没有覆盖住父類的方法 )

     这对于多态来说确实是个不小的麻烦我们看看编译器是如何解决这个问题的。

      问题还没有完多态中的方法覆盖是可以了,泹是桥方法却带来了一个疑问:

      ② 我们绝对不能编写出方法签名一样的多个方法 如果这样写程序,编译器是不会放过的这也毫无疑问!
      ③ 最重要的一点是:JVM会用参数类型和返回类型来确定一个方法。 一旦编译器通过某种方式自己编译出方法签名一样的两个方法(只能编译器自己来创造这种奇迹我们程序员却不能人为的编写这种代码)。JVM还是能够分清楚这些方法的前提是需要返回类型不一样。

(2) 泛型类型中嘚方法冲突

        首先、我们都知道子类方法要覆盖必须与父类方法具有相同的方法签名(方法名+参数列表)。而且必须保证子类的访问权限>=父类的访问权限这是大家都知道的事实。

接着、编译器将泛型代码中的T用Object替代(擦除)突然发现擦除以后equals(T)变成了equals(Object),糟糕了这个方法與Object类中的equals一样了。基于开始确定没有覆盖这样一个想法编译器彻底的疯了(精神分裂)。然后得出两个结论:①坚持原来的思想:没有覆盖但现在一样造成了方法冲突了。   ②写这程序的程序员疯了(哈哈)

(3) 没有泛型数组一说

       这就麻烦了,理论上将Object[]可以存储所有Pair对象但这些Pair对潒是泛型对象,他们的类型变量都不一样那么调用每一个Object[]数组元素的对象方法可能都会得到不同的记过,也许是个字符串也许是整形,这对于JVM可是无法预料的


    ② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换(类型擦除)
    ③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难

我要回帖

更多关于 java的jvm 的文章

 

随机推荐