当前位置: 首页 > 知识库问答 >
问题:

实现接口的给定类上的getDeclared方法会给出更多结果,为什么?

商棋
2023-03-14

我的 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与方法findId

使用方法findId类java.lang.Object

这个findBy从何而来?从界面还是从Spring?(我没有使用returnedType对象定义方法findID(我确定)。

和getDeclaredMethods()的文档

返回{@code Method}对象的数组,这些对象反映由这个* {@code Class}对象表示的类或接口声明的所有*方法。这包括公共、受保护、默认*(包)访问和私有方法,但不包括继承的方法。*返回的数组中的元素没有排序,也没有任何特定的顺序。如果类*或接口未声明任何方法,或者如果此{@code Class}对象*表示基元类型、数组类或void,则此方法返回长度为0的数组。*返回的数组中不包含class *初始化方法{@code }。如果该类用相同的参数类型声明了多个公共成员方法*,则它们都包含在返回的*数组中。

共有1个答案

尉迟栋
2023-03-14

这是因为E泛型类型和类型擦除。泛型类型替换为字节码中的Object

如果你看看这个例子,你会发现

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; } 

您在您的旁边看到一个附加方法的原因是因为编译器添加了一个合成桥方法。

与上述示例相关的报价:

NumericValue类在类型擦除后实现了非泛型的可比较接口,编译器添加了一个所谓的桥接方法。需要桥接方法,以便NumericValue类在类型擦除后仍然是一个实现可比较接口的类。

另请参阅:

    < Li > Java中泛型的擦除是什么概念?
 类似资料:
  • 问题内容: 在Golang中工作,正在尝试使用接口将使用相似方法的一组结构归为一组。简而言之,我有这个: 然后,应该用作接口的结构: 我想念什么?还是我做错了什么? 问题答案: 如果您的接口这样声明: 然后,任何实现a的类型都将满足该接口。 在您的情况下,然后创建此方法: 这意味着类型满足接口。 但是..注意那里。没有实现该接口,而是由谁来实现。 因此,在尝试为接口变量分配类型时,请确保使用指针而

  • 我的任务是使用用户填充的int数组合并两个数组,我们必须假设用户最多有10000个输入,用户输入负数停止。然后将数组从最小到最大排序并打印出来。起初我以为这很容易,但当我完成时,我开始得到如下输出: 正如你所看到的,这六个是不合适的,我不知道如何修复它。这是源代码,我已经包括了大量的评论,因为我真的希望你们能帮助我尽你们最大的能力。如果可以使用相同的技术而不在代码中实现新的技术和方法,请这样做。我

  • 问题内容: 情况一: 输出: 2005年7月8日星期五00:00:00 GMT-0700(PST) 案例二: 输出: Thu Jul 07 2005 17:00:00 GMT-0700(PST) 为什么第二次解析不正确? 问题答案: 在第5版规范发布之前,该Date.parse方法完全依赖于实现(除后者返回数字而不是a之外,其他方法new Date(string)等效)。在第5版规范中,添加了该要

  • 问题内容: 我正在大学学习基础知识,并且希望对Eclipse中的以下错误有所帮助:“对于类型ShopCLI,未定义方法getCost()”& 这是我的代码 问题答案: 方法是在订单类中定义的,而不是在类中定义的。所以你的代码: 应该改为

  • 问题内容: 我尝试将matlab代码转换为numpy,并发现numpy与std函数的结果不同。 在matlab中 在numpy中 这正常吗?我应该如何处理呢? 问题答案: NumPy函数采用一个可选参数:“自由度增量”。默认情况下是。对其进行设置以获取MATLAB结果: 要添加更多上下文,在计算方差(标准偏差为平方根)时,通常将其除以我们拥有的值的数量。 但是,如果我们从较大的分布中选择元素的随机

  • 我使用JavaScript有这个条件,我有两个文本框,我将在其中比较输入(输入是数字)。条件是当textbox 2小于textbox 1时,它将显示一条警告消息,说明textbox 2必须大于textbox 2。所以当输入是这样的时候 为什么当它将2与9进行比较时,它不会发出任何警报? 以下是我的情况: