}
class F extends E {
}
class X {
public E getE() {
return new E();
}
}
class Y extends X {
@Override
public F getE() {
return new F();
}
}
以上代码是可以编译通过的。让我们再来查看一下Y的字节码:
class org.levin.insidejvm.miscs.bridgemethod.Y extends org.levin.insidejvm.miscs.bridgemethod.X {
public org.levin.insidejvm.miscs.bridgemethod.F getE();
0 new org.levin.insidejvm.miscs.bridgemethod.F [16]
3 dup
4 invokespecial org.levin.insidejvm.miscs.bridgemethod.F() [18]
7 areturn
public bridge synthetic org.levin.insidejvm.miscs.bridgemethod.E getE();
0 aload_0 [this]
1 invokevirtual org.levin.insidejvm.miscs.bridgemethod.Y.getE() : org.levin.insidejvm.miscs.bridgemethod.F [20]
4 areturn
}
从字节码上,我们可以看出语法本身事实上并没有发生变化,变化的只是编译器做的支持,它为重载方法重新生成了一个返回E而不是F的bridge方法。
从调用的字节码上可以更加明显的看出语法没有发生变化这一点:
public static void main(String[] args) {
X x = new Y();
x.getE();
}
字节码如下:
public static void main(java.lang.String[] args);
0 new org.levin.insidejvm.miscs.bridgemethod.Y [16]
3 dup
4 invokespecial org.levin.insidejvm.miscs.bridgemethod.Y() [18]
7 astore_1 [x]
8 aload_1 [x]
9 invokevirtual org.levin.insidejvm.miscs.bridgemethod.X.getE() : org.levin.insidejvm.miscs.bridgemethod.E [19]
12 pop
13 return
该字节码中x.getE()方法事实上调用的就是生成的bridge方法(E getE())方法,而不是用户定义的F getE()方法。
这种重载机制在某些,不同子类某个函数的返回