实现通用java接口添加了额外的方法

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)

esi*_*n88 3

第二种方法是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)