Java 如何使用桥接方法实现共变返回类型

Java 如何使用桥接方法实现共变返回类型,java,generics,bridge,covariant-return-types,Java,Generics,Bridge,Covariant Return Types,我目前正在学习java泛型,学习的是《Maurice Naftalin 2006的java泛型和集合》 在返回类型上的协变重写部分中,作者声明 有人能给我解释一下,实现是什么样的,即桥接方法中的代码是什么样的吗?桥接方法是否调用原始方法(即带有签名的方法public Point clone())?我建议您参考它并进行一些测试以了解桥接机制 桥接是一个工件,它超越了Java 1.5之前编译时不变的重写方法能力 Java1.5支持协变返回类型。这是什么意思?之前 1.5,重写超类方法时,重写方法

我目前正在学习java泛型,学习的是《Maurice Naftalin 2006的java泛型和集合》

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

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

我建议您参考它并进行一些测试以了解桥接机制

桥接是一个工件,它超越了Java 1.5之前编译时不变的重写方法能力

Java1.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 } 从“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:返回 受保护点克隆()抛出java.lang.CloneNotSupportedException; 代码: 0:新的#4//课程点 3:dup 4:aload_0 5:getfield#2//字段x:I 8:aload_0 9:getfield#3//fieldy:I 12:调用特别的#5//方法“”:(II)V 15:轮到你了 受保护的java.lang.Object clone()抛出java.lang.CloneNotSupportedException; 代码: 0:aload_0 1:invokevirtual#6//方法克隆:()LPoint; 4:轮到你了 } 您可以看到
对象克隆()
点克隆()
之间的委托
当然,您不能编写这样的代码,因为Java在编译时不允许基于返回类型的重载,但在运行时JVM可以从编译的类中使用此功能

有人能给我解释一下,实现是什么样的,即桥接方法中的代码是什么样的吗

这里我们提供一个示例:该类包含一个
bridge
方法

  • 以下是此方法的调用图:

  • 以下是此方法的
    解码字节码

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

  • 桥除了简单地调用原始方法外,什么也不做
  • 因此,这就是名为“桥”的原因

请发布代码,而不是图片。可能重复的dupe目标,更具体地说,接受的答案提供了为什么使用桥接方法以及如何实现它们的良好概述。应该涵盖你想知道的一切。这个问题可以帮助你: