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:
如评论中所述,协变覆盖也需要桥接方法:
通常,方法Object clone()可以被a覆盖MyObject clone(),但编译器将生成桥接方法:
public bridge Object MyObject.clone();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5256 次 |
| 最近记录: |