Java 接口合成方法生成,同时缩小返回类型

2024-05-03

我有 2 个接口和 2 个返回类型。

interface interfaceA {
   Publisher<String> doSomething();
}

interface interfaceB extends interfaceA {
   Flow<String> doSomething();
}

interface Publisher<T>{}
class Flow<T> implements Publisher<T>{}

所以在运行时,我可以看到两种方法interfaceB.class.getMethods()

  1. public default my.package.Publisher my.package.interfaceB.doSomething()

  2. public abstract my.package.Flow my.package.interfaceB.doSomething()

关于第一个,它是合成的。(method.getModifiers() & 0x00001000 > 0) == true

java会自动生成这个合成方法吗?

它一般如何运作?


您在这里看到的称为桥接方法。

要理解为什么需要这样做,我们必须看看 JVM 如何确定两个方法是否不同:

  • 每个方法都有一个名称。不同的名称 -> 不同的方法。
  • 每个方法都有一个描述符。不同的描述符->不同的方法。

描述符包含所有参数和返回类型(对于泛型,它是擦除的)。

从JVM角度来看Flow doSomething()是一种不同的方法Publisher doSomething(),因此当要求执行 invokeinterface 调用时Publisher doSomething()它不会打电话Flow doSomething().

如果调用点的目标类型为interfaceA:

intefaceA foo = ...;
foo.doSomething();

但从语言的角度来看,这两种方法是相同的,并且一种方法会覆盖另一种方法。

为了恢复这段关系,javac添加一个具有原始方法类型的桥接方法,该方法仅调用重载方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 接口合成方法生成,同时缩小返回类型 的相关文章

随机推荐

  • 如何在数据流中正确使用“展平”

    我们的管道如下所示 GCS gz 压缩文件 gt ParDo gt BigQuery 我想使用 展平 从 GCS 中提取多个文件作为管道的输入 但它一直因错误而烦恼 Workflow failed Causes 5001e5764f46ac
  • Rails 形式的当前日期

    我正在学习 Rails 并在书外进行一些探索 并随着知识的增长创建一个具有附加功能的简单应用程序 我正在编写一个简单的博客应用程序 我在表单中添加了一个名为 日期 的字段 我不希望这是一个字段 我希望它从服务器获取日期并将其自动放入数据库中
  • iPhone - 让 VoiceOver 宣布标签文本更改

    如果标签上的文本发生更改 是否可以使用 iPhone 上的 VoiceOver 来宣布更新后的文本 这类似于 ARIA 中的实时区域 Thanks 您可以使用 VoiceOver 朗读您喜欢的任何文本 UIAccessibilityPost
  • 如何保存我更改的网格中的行

    我使用 ng resource 从服务器获取数据 然后将数据放入表格网格中 如下所示 div div
  • JObject ToString 与 StringEnumConverter 不起作用

    我正在尝试序列化一个匿名类 如下所示 public enum ErrorCode A B C var response JObject FromObject new Error new Message Test Code ErrorCode
  • 无法更改 Visual Studio 2013 中的字体

    我曾经可以通过以下方式更改 Visual Studio 2013 的字体和颜色Tools gt Options then Environment gt Fonts and Colors 最后显示文本编辑器的设置 但是 现在我无法显示文本编辑
  • 使用 Tiny Scrollbar 自动滚动到 div 底部

    我正在编写一个shoutbox 并使其尽可能用户友好 它使用微型滚动条插件 http plugins jquery com project tinyscrollbar对于 jQuery 我想合并一个额外的函数 让我可以让它到达底部div 它
  • 如何仅使用 Javascript 减慢平滑滚动的默认速度?

    我的目标是按回车键 然后让网站滚动到底部 我已将滚动行为设置为平滑 一切都正常工作 除了平滑滚动的默认速度太快了 我怎样才能减慢它的速度 下面是我的代码 请不要使用jquery 谢谢你 document body onkeyup funct
  • 我可以通过索引访问 Parquet 文件而不将整个文件读入内存吗?

    我刚刚读到 HDF5 允许您访问数据查找 而无需将整个文件读入内存 这种寻找行为在没有 Java 的 Parquet 文件中是否可能 非 pyspark 解决方案 我使用 Parquet 是因为它有强大的 dtype 支持 import h
  • 类型错误:req.logIn 不是函数 - Passport JS

    我很确定这不是一个错误 因为谷歌搜索没有发现任何结果 我正在使用 Passport JS 和本地策略 在我的登录路线上 我使用自定义回调 并在确定用户存在后调用 req login 因为文档显示 请注意 当使用自定义 回调 应用程序有责任建
  • 如何在外部浏览器中打开 Android 应用程序中的链接?

    任何人都可以帮助我在代码中打开外部浏览器或其他 Android 应用程序中的链接吗 现在的情况是链接在应用程序本身中打开 但如果该链接属于 Android 应用程序 则无法打开 它显示安装 Android 应用程序 所以我希望如果链接可以在
  • 如何设置属性选择器的值 Expression>

    我需要使用模式工厂的想法将 Person 类实体中的实体属性 Address 与 FactoryEntities 类中的表达式 linq 相关联 看看这就是我所拥有的并且我想要做的 Address address new Address a
  • 获取发送 cURL 请求的用户的 IP 地址

    我想获取使用 php 中的 cURL POST 方法向我的服务器发送请求的用户的 IP 地址 我正在开发一个 Flight API 我将使用 cURL POST 方法获取请求 我必须获取客户端的 IP 地址并验证他的 IP 地址是否可用 如
  • Inno Setup:如何在选中的复选框上显示(隐藏/取消隐藏)密码

    我在输入查询页面中添加了一个复选框 以便在选中时使用它向我显示未发现的密码 但我不知道该怎么做 我已经创建了以下过程 但这个过程并没有改变我添加输入时的 true false 值 此过程添加了我完成这项工作的新文本框 请你帮助我好吗 pro
  • 社交登录重复帐户冲突

    我正在制作一个新应用程序 除了常规电子邮件 密码注册之外 还需要多个社交注册 但是有一种特殊情况可能会导致数据完整性问题 例子 用户在 Facebook 上注册 但没有收到任何电子邮件回复 我在数据库中创建一个用户 将电子邮件和密码设置为
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • Python 对象属性 - 访问方法

    假设我有一个具有某些属性的类 在 Pythonic OOP 中 如何访问这些属性是最好的 就像obj attr 或者也许编写 get 访问器 此类事物可接受的命名风格是什么 Edit 您能否详细说明使用单下划线或双前导下划线命名属性的最佳实
  • 在 MS Excel 中为字符分配一个值并执行字符串(具有字符)的数学函数(+、-、*、/)

    我想根据给定字符串 ABCDEF 的预分配值对其进行求和 即首先我想为每个字符分配值 然后计算具有预先分配的字符的字符串的总值 excel中可以实现这个功能吗 例如 在下面 A 2 B 5 C 8 D 1 E 1 F 2 sum of AB
  • 如何在primefaces中文件上传期间传递参数[重复]

    这个问题在这里已经有答案了 我使用 jsf2 0 和 primfaces 并使用 p fileupload 上传照片 这里我需要在支持 bean 中传递参数 因为没有通过 p fileupload 传递参数的选项 我也使用了绑定选项 但它在
  • Java 接口合成方法生成,同时缩小返回类型

    我有 2 个接口和 2 个返回类型 interface interfaceA Publisher