JCv*_*mme 5 java generics inheritance
我有一个Id<T>
带有单个方法的通用java接口T getId()
和一个MyClass
实现的类Id<Long>
.当我检查MyClass
使用java反射声明的方法时,我看到两个方法:一个具有返回类型Long
,另一个具有返回类型Object
.第二种方法来自何处,如何将其删除?
这是来源:
package mypackage;
import java.lang.reflect.Method;
public class MainClass {
public static void main(String[] args) {
for (Method method : MyClass.class.getDeclaredMethods()) {
System.out.println(method);
}
// prints out two lines
// public java.lang.Long mypackage.MyClass.getId() <-- ok
// public java.lang.Object mypackage.MyClass.getId() <-- not ok
}
}
interface Id<T> {
T getId();
}
class MyClass implements Id<Long> {
@Override
public Long getId() {
return new Long(0);
};
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是synthetic bridge
方法,可以用method.isSynthetic()
或检查method.isBridge()
。您无法删除它,但如果您不想在声明的方法列表中看到它,只需检查所有这些方法是否具有isBridge() == false
.
合成桥方法在编译期间自动添加到泛型类中。您可以在此处阅读有关合成方法的更多信息。
for (Method method : MyClass.class.getDeclaredMethods()) {
System.out.println("Method: " + method);
System.out.println("synthetic: " + method.isSynthetic());
System.out.println("bridge: " + method.isBridge());
}
// 1
//Method: public java.lang.Long Main$MyClass.getId()
//synthetic: false
//bridge: false
// 2
//Method: public java.lang.Object Main$MyClass.getId()
//synthetic: true
//bridge: true
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
216 次 |
最近记录: |