我想知道为什么Java编译器会在这里为foo
方法添加一个桥接方法:
public class Outer {
class SuperClass {
public void foo() { }
}
public class SubClass extends SuperClass { }
}
foo
方法在public
类型中编译为SuperClass
。然而,SubClass
方法重新定义了该方法作为同一方法的桥梁。我想知道为什么这座桥是必要的。
答案 0 :(得分:1)
添加此桥接方法的合理性是Java反射API中的一个例子,它会导致IllegalAccessException
没有添加桥接方法。该错误记录在Oracle's bug tracker:
反思性调用
Subclass.class.getMethod("foo").invoke(new Subclass())
如果没有桥接方法修复,则没有正确地从其他包中正确处理
,因为Java运行时无法确定SuperClass
方法的调用是否合法。反射处理可见性检查方法的声明类型,然后错误地断定该方法不可见且其调用非法。
根据机票上的文档,没有更简单的解决方法。然而,即使在添加桥接方法之前,也会正常处理非反射调用。