代码之家  ›  专栏  ›  技术社区  ›  Thor

如何使用bridge方法实现covarient返回类型

  •  -1
  • Thor  · 技术社区  · 6 年前

    我目前正在学习Java泛型,遵循这本书“Java泛型和Maurice Naftalin 2006的集合”。

    在返回类型的协变重写部分中,作者声明

    enter image description here enter image description here

    有人能给我解释一下,实现是什么样子的,比如bridge方法中的代码是什么样子的?桥方法是否调用原始方法(即带有签名的方法 public Point clone() )?

    1 回复  |  直到 6 年前
        1
  •  1
  •   davidxxx    6 年前

    我建议你参考 Oracle material 并对其进行了测试,以了解桥梁的作用机理。

    桥是超越Java 1.5之前编译时不变的重写方法能力的工件。

    Java 1.5支持协变返回类型。这是什么意思?以前 1.5,当重写超类方法时,重写方法的名称、参数类型和返回类型必须与 超类方法。重写方法称为 关于参数类型和返回类型。

    如果您更改任何参数类型,则不会真正重写 方法——实际上是在重载它。

    这座桥是座桥,所以它是一个连接点。在这里,它介于具有原始返回类型的方法和具有协变返回类型的重写方法之间。
    所以是的,你是对的。

    你想查一下吗? 编译这个类,然后反汇编它的源代码。

    $javap-c point.class类

    你会得到如下信息:

    Compiled from "Point.java"
    public class Point {
      public Point(int, int);
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: aload_0
           5: iload_1
           6: putfield      #2                  // Field x:I
           9: aload_0
          10: iload_2
          11: putfield      #3                  // Field y:I
          14: return
    
      protected Point clone() throws java.lang.CloneNotSupportedException;
        Code:
           0: new           #4                  // class Point
           3: dup
           4: aload_0
           5: getfield      #2                  // Field x:I
           8: aload_0
           9: getfield      #3                  // Field y:I
          12: invokespecial #5                  // Method "":(II)V
          15: areturn
    
      protected java.lang.Object clone() throws java.lang.CloneNotSupportedException;
        Code:
           0: aload_0
           1: invokevirtual #6                  // Method clone:()LPoint;
           4: areturn
    }
    

    你可以看到 Object clone() Point clone()
    当然,在编译时不允许在Java中编写代码,如返回类型的重载,但在运行时JVM可以从编译的类中使用此特性。