【发布时间】:2022-06-19 17:15:31
【问题描述】:
我有两节课
// 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>{
}
我尝试运行以下代码
// 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()]
通过字节码,我认为这是一个桥接方法,但我不知道它为什么会生成,如果我将BaseClass公开它就会消失。
// 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
}
我的问题是:
- 如果 BaseClass 是默认的,为什么
getTest()会生成桥接方法? - 为什么
getTest2()和getTest3()没有生成它们的桥接方法?这似乎与泛型有关。
【问题讨论】:
-
我得到了所有 3 个
getTest方法。您确定在描述您的情况时没有遗漏任何内容吗? -
您使用的是什么 Java 版本?
-
@Sweeper 我确定,只有在不是泛型的情况下,我才能得到
getTestmethod 的全部 3 个 -
@Lino 我的 Java 版本是 1.8.0_281
-
@Lino 虽然我在 Java 18.0.1 上看到了同样的事情