首页 > 解决方案 > 如何使用桥接方法实现协变返回类型

问题描述

我目前正在按照“java generics and collection by Maurice Naftalin 2006”一书学习java泛型。

在 covariant overriding on return type 一节中,作者说

在此处输入图像描述 在此处输入图像描述

有人可以向我解释一下,实现是什么,即桥方法中的代码会是什么样子?桥接方法是否调用原始方法(即带有签名的方法public Point clone())?

标签: javagenericsbridgecovariant-return-types

解决方案


建议你参考Oracle的资料,做一些测试来理解桥接机制。

Bridge 是超越 Java 1.5 之前的编译时不变的覆盖方法能力的工件。

Java 1.5 支持协变返回类型。这是什么意思?在 1.5 之前,覆盖超类方法时,覆盖方法的名称、参数类型和返回类型必须与超类方法的名称、参数类型和返回类型完全相同。重写方法被认为在参数类型和返回类型方面是不变的。

如果您更改任何参数类型,那么您并没有真正覆盖一个方法——您实际上是在重载它。

桥就是桥:所以它建立了一个链接。这里它介于具有原始返回类型的方法和具有协变返回类型的覆盖方法之间。
所以是的,你是对的。

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

$ javap -c Point.class

你会得到类似的东西:

编译自“Point.java”
公共类点{
  公共点(int,int);
    代码:
       0:aload_0
       1: invokespecial #1 // 方法 java/lang/Object."":()V
       4:aload_0
       5:iload_1
       6: putfield #2 // 字段 x:I
       9:aload_0
      10:iload_2
      11: putfield #3 // 字段 y:I
      14:返回

  protected Point clone() 抛出 java.lang.CloneNotSupportedException;
    代码:
       0: new #4 // 类点
       3:重复
       4:aload_0
       5: getfield #2 // 字段 x:I
       8:aload_0
       9: getfield #3 // 字段 y:I
      12: invokespecial #5 // 方法 "":(II)V
      15:返回

  protected java.lang.Object clone() 抛出 java.lang.CloneNotSupportedException;
    代码:
       0:aload_0
       1: invokevirtual #6 // 方法 clone:()LPoint;
       4:返回
}

您可以看到 和 之间的Object clone()委托Point clone()
当然,您不能编写代码,因为在编译时 Java 中不允许基于返回类型的重载,但在运行时 JVM 可以从已编译的类中使用此功能。


推荐阅读