我的Spring应用程序中有这个Groovy代码段
Class.forName(com.example.Name).getDeclaredMethods().each { method ->
if (method.getName() == ('findId')) {
println method.returnType.name
println method.getName()
}
}
和界面:
public interface Find<E, D> {
E findId(D id);
}
和班级:
class Name implements Find<MyType,String>{
...
}
当我的代码snipet被执行时,我希望只有一个返回类型MyType的方法,但我有2个?
类com.example.MyType with method findId
和
使用方法 findId类java.lang.Object
这个发现可以来自哪里?从界面还是从Spring? (我没有使用returnedType对象定义方法findID(我确定)。
和getDeclaredMethods()的文档
返回反映所有内容的{@code Method}对象数组 *由此类或由此表示的接口声明的方法 * {@code Class}对象。这包括公共,受保护,默认 *(包)访问和私有方法,但不包括继承的方法。 *返回的数组中的元素没有排序,也没有排序 *特别订单。如果是类,此方法返回长度为0的数组 *或接口声明没有方法,或者这个{@code Class}对象 *表示基本类型,数组类或void。班级 *初始化方法{@code}不包括在内 *返回数组。如果类声明了多个公共成员方法 *具有相同的参数类型,它们都包含在返回的中 *数组。
答案 0 :(得分:2)
这是因为E
泛型类型和类型擦除。通用类型在字节代码中替换为Object
。
如果您查看this example,就会看到
private X first;
private Y second;
public X getFirst() { return first; }
public Y getSecond() { return second; }
在类型擦除后转向此
private Object first;
private Object second;
public Object getFirst() { return first; }
public Object getSecond() { return second; }
您在旁边看到其他方法的原因是因为编译器添加了合成bridge method。
引用与上面的例子相关:
NumericValue类在类型擦除后实现非通用的Comparable接口,编译器添加了一个所谓的桥接方法。需要桥接方法,以便类NumericValue仍然是在类型擦除后实现Comparable接口的类。
另见: