【问题标题】:How covarient return type is implemented using bridge method如何使用桥接方法实现协变返回类型
【发布时间】:2018-11-25 00:08:03
【问题描述】:

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

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

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

【问题讨论】:

标签: java generics bridge covariant-return-types


【解决方案1】:

我建议你参考Oracle material并做一些测试以了解桥接机制。

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 可以从已编译的类中使用此功能。

【讨论】:

    【解决方案2】:

    有人可以向我解释一下,实现是什么,即桥方法中的代码是什么样的?

    这里我们提供一个例子:类java.text.AttributeEntry包含一个bridge方法getKey()

    • 这里是这个方法的call graph

    • 这里是这个方法的decoded byte code

    here 列出了JDK 中的所有bridge 方法。在回顾了其中的几个之后,我们可能会得出以下结论:

    • bridge 什么都不做,只是简单地调用原始方法
    • 这就是 bridge 这个名字的由来

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 2011-02-10
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2011-05-16
      相关资源
      最近更新 更多