kng*_*kng 6 java generics erasure
乍一看,我认为以下是有道理的:
interface Test<T> {
T getValue(T n);
}
class Impl implements Test<Integer>{
public Integer getValue(Integer n){
return n;
}
}
Run Code Online (Sandbox Code Playgroud)
它编译正确,所以一切看起来都很好。
但是后来我在擦除的上下文中考虑了更多,在我看来,Test 接口被擦除为:
interface Test {
Object getValue(Object n);
}
Run Code Online (Sandbox Code Playgroud)
那么 Impl 怎么还能实现 Test 呢?
HTN*_*TNW 13
javac 实际上为此创建了桥接方法:
class Impl implements Test<Integer>{
@Override public Integer getValue(Integer n){
return n;
}
}
Run Code Online (Sandbox Code Playgroud)
编译为
class Impl implements Test {
public Integer getValue(Integer n) { // overrides nothing!
return n;
}
@Override @Synthetic @Bridge public Object getValue(Object n) {
return this.getValue((Integer)n);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:SyntheticandBridge不是真正的注解,但编译后的类文件确实将这些方法标记为“合成”和“桥接”。
通过使用这些桥接方法,Java 确保如果您有一个Impl,您可以调用Impl#getValue(Integer)Integer(如果您知道它实际上有 type Impl),或者您可以调用“泛型” Test#getValue(Object)Object,如果您只知道它是一个Test<?>.