只要返回类型不同,JVM字节码格式允许声明具有相同名称和相同参数类型的多个方法,尽管Java语言不允许这样做.这意味着a)其他JVM语言可以使用它,b)它可以用于特殊的“编译器魔术”语言功能.
最常见的是,编译器在处理泛型时会发出多个具有相同名称和相同参数类型的方法. JVM方法查找依赖于匹配的整个签名,而不仅仅是参数类型.因此,编译器必须发出所谓的桥接方法,以便在签名方面覆盖或遮蔽其他方法.考虑这个例子:
interface Foo
{
T foo(); // desc: ()Ljava/lang/Object;
void bar(T value); // desc: (Ljava/lang/Object;)V
Object baz(); // desc: ()Ljava/lang/Object;
}
class StringFoo implements Foo
{
@Override
public String foo() { ... } // desc: ()Ljava/lang/String; // !
@Override
public void bar(String value) { ... } // desc: (Ljava/lang/String;)V // !
@Override
public String baz() { ... } // desc: ()Ljava/lang/String; // !
}
StringFoo类需要三个额外的桥接方法来实际覆盖具有相同desc的接口方法:
class StringFoo implements Foo
{
public String foo() { ... }
public /* synthetic brid
版权声明:本文为weixin_35338620原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。