Java接口综合方法生成,同时缩小返回类型 [英] Java interface synthetic method generation while narrowing return type

查看:78
本文介绍了Java接口综合方法生成,同时缩小返回类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have 2 interfaces, and 2 return types.

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

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

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

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

So at runtime, I can see 2 methods of interfaceB.class.getMethods()

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

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

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

Regarding the first one, it is Synthetic. (method.getModifiers() & 0x00001000 > 0) == true

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

Does java autogenerate this synthetic methods?

它一般如何工作?

推荐答案

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

What you see here is called a bridge method.

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

To understand why this is needed, we have to look at how the JVM determines if two methods are different:

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

描述符包含所有参数和返回类型(使用泛型,则被擦除).

The descriptor contains all arguments and the return type (with generics, it's erasure).

从JVM角度来看,Flow doSomething()是与Publisher doSomething()不同的方法,因此当要求它对Publisher doSomething()进行invokeinterface调用时,它将不会调用Flow doSomething().

From the JVM perspective Flow doSomething() is a different method than Publisher doSomething(), so when it is asked to do a invokeinterface call to Publisher doSomething() it won't call Flow doSomething().

如果呼叫站点的目标类型为interfaceA,则会发生这种情况:

This can happen if the target at the callsite is of type interfaceA:

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

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

But from the language perspective, both methods are the same, and one overrides the other.

要恢复这种关系,javac添加一个具有原始方法类型的桥方法,该方法仅调用重载方法.

To restore this relationship, javac adds a bridge method with the original method type that just calls the overloaded method.

这篇关于Java接口综合方法生成,同时缩小返回类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆