java - 如何使用桥接方法实现协变返回类型
问题描述
我目前正在按照“java generics and collection by Maurice Naftalin 2006”一书学习java泛型。
在 covariant overriding on return type 一节中,作者说
有人可以向我解释一下,实现是什么,即桥方法中的代码会是什么样子?桥接方法是否调用原始方法(即带有签名的方法public Point clone()
)?
解决方案
建议你参考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 可以从已编译的类中使用此功能。
推荐阅读
- java - 杰克逊 NoClassDefFoundError: com/fasterxml/jackson/core/JsonFactory
- sql - 如何根据列值的优先级进行查询
- android - 找不到 `aapt` 命令,因此无法清理状态栏...
- google-sheets - COUNTIF 具有绝对列,Google 表格中的相对行
- java - 检索由 EMF 比较计算的 ADD Diff 中的“值匹配”
- powershell - 如何通过 Powershell 从 AD 组设置所有者属性(不由其管理)?
- javascript - 如何使用 jquery 从浏览器中的 Cookie 获取 sessionid?
- android - 使用 Glide 库:如何在头像右侧设置相机图标?
- android - 如何正确调用 newInstance 方法?
- arrays - discord.js 将 .json 值导入变量