我有两门课
// BaseClass.java
class BaseClass<T> {
public String getTest(){
return "one";
}
public String getTest2(T t){
return "two";
}
public String getTest3(T t){
return "three";
}
}
// OverrideClass.java
public class OverrideClass extends BaseClass<Test>{
}
我try 运行以下代码
// Test.java
public class Test {
public static void main(String[] args) {
Class<OverrideClass> overrideClass = OverrideClass.class;
Method[] declaredMethods = overrideClass.getDeclaredMethods();
System.out.println(Arrays.toString(declaredMethods));
}
}
我认为它应该输出
[]
但实际上输出是
[public java.lang.String OverrideClass.getTest()]
通过字节码,我认为这是一个桥接方法,但我不知道为什么它会生成,如果我将基类公开,它就会消失.
// access flags 0x1041
public synthetic bridge getTest()Ljava/lang/String;
L0
LINENUMBER 1 L0
ALOAD 0
INVOKESPECIAL BaseClass.getTest ()Ljava/lang/String;
ARETURN
L1
LOCALVARIABLE this LOverrideClass; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
}
我的问题是:
- 如果基类是默认值,为什么
getTest()
会生成桥接方法? - 为什么
getTest2()
和getTest3()
没有生成他们的桥接方法?这似乎与泛型有关.
谢谢你的帮助!