Java接口综合方法生成,同时缩小返回类型 [英] Java interface synthetic method generation while narrowing return type
问题描述
我有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()
-
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屋!