Method.isBridge用于什么?

Nrj*_*Nrj 27 java api reflection

java.lang.reflect.Method课程导航期间,我遇到了这个方法isBridge.它的Javadoc说它只有在Java规范声明方法为true时才返回true.

请帮我理解这是用来做什么的!如果需要,自定义类可以将其方法声明为桥接吗?

Von*_*onC 27

当扩展其方法具有参数化参数的参数化类型时,编译器可以创建桥接方法.

您可以在此类BridgeMethodResolver中找到获取"桥接方法"引用的实际方法的方法.

请参见创建框架,同步,传输控制:

作为这种情况的一个例子,请考虑声明:

class C<T> { abstract T id(T x); }
class D extends C<String> { String id(String x) { return x; } }
Run Code Online (Sandbox Code Playgroud)

现在,给出一个调用

C c = new D();
c.id(new Object()); // fails with a ClassCastException
Run Code Online (Sandbox Code Playgroud)

被调用的实际方法的擦除,D.id(String)其签名与编译时方法声明的签名不同,C.id(Object).前者采用String类型的参数,而后者采用Object类型的参数.在执行方法体之前,调用失败并带有ClassCastException.

只有当程序产生未经检查的警告时,才会出现这种情况(§5.1.9).

实现可以通过创建桥接方法来强制实施这些语义.在上面的示例中,将在D类中创建以下桥接方法:

Object id(Object x) { return id((String) x); }
Run Code Online (Sandbox Code Playgroud)

这是Java虚拟机为响应c.id(new Object())上面显示的调用而实际调用的方法,它将根据需要执行强制转换和失败.

另见Bridge:

如评论中所述,协变覆盖也需要桥接方法:

  • 在Java 1.4及更早版本中,如果签名完全匹配,则一种方法可以覆盖另一种方法.
  • 在Java 5中,如果参数完全匹配,则方法可以覆盖另一个,但是如果它是另一个方法的返回类型的类型,则覆盖方法的返回类型.

通常,方法Object clone()可以被a覆盖MyObject clone(),但编译器将生成桥接方法:

public bridge Object MyObject.clone();
Run Code Online (Sandbox Code Playgroud)

  • 即使没有泛型,桥接方法也是协变返回类型所必需的. (2认同)