Java Class::getMethod和Object.Class参数是如何工作的?

Java Class::getMethod和Object.Class参数是如何工作的?,java,reflection,compare,Java,Reflection,Compare,打印public int java.lang.String.compareTo(java.lang.Object) 不编译,因为类型字符串中的方法compareTo(字符串)不适用于参数(对象) 为什么?这正是泛型要解决的问题。在编译时,编译器可以使用泛型来告诉您将字符串与对象进行比较是不可行的 但是,在运行时,泛型会被删除。因此,您可以根据对象方法参数将字符串与对象进行比较。实现,它定义了方法 由于类型擦除,该方法在运行时实际上是compareTo(objecto) 不管怎样,String将该

打印
public int java.lang.String.compareTo(java.lang.Object)

不编译,因为类型字符串中的方法compareTo(字符串)不适用于参数(对象)

为什么?

这正是泛型要解决的问题。在编译时,编译器可以使用泛型来告诉您将字符串与对象进行比较是不可行的

但是,在运行时,泛型会被删除。因此,您可以根据对象方法参数将字符串与对象进行比较。

实现,它定义了方法

由于类型擦除,该方法在运行时实际上是
compareTo(objecto)

不管怎样,
String
将该方法实现为
compareTo(stringo)

由于它具有不同的签名,Java编译器生成一个“合成”的“桥接”方法来使其工作,这意味着您将得到:

公共接口{
公共国际比较组织(对象o);
}
公共类字符串实现了可比较的{
公共整数比较(字符串o){
...
}
公共合成桥内部比较(对象o){
返回compareTo((字符串)o);
}
}
synthetic
bridge
当然不是可以放入Java源文件中的实际关键字,但是这些修饰符在运行时会出现在反射数据中

合成方法是由编译器出于内部原因生成的,因此它们被认为是“隐藏的”,这意味着您无法在Java源文件中看到它们,这就是为什么
compareTo(new Object())
不会编译的原因


但是,您可以通过反射看到该方法,但是从这里显示的实现中可以看到,如果您通过反射实际调用了
compareTo(newobject())
,您将得到一个.

,因为编译器知道
String
Comparable
的泛型参数是
。反射不知道这一点,因为类型擦除。实际上,您无法比较它们;如果使用字符串以外的对象,则会出现类强制转换异常。但是方法签名没有告诉你这一点(没有泛型)。@khelwood-true。这就是你应该/需要阅读文档的原因,文档的具体状态是什么this@ControlAltDel为什么在运行时会有两个方法实例(compareTo(对象)和compareTo(字符串)?泛型会被删除,听起来就像只有compareTo(对象)一样@user3561614我不知道什么是方法实例,但只有一个方法。区别在于泛型有助于在编译时识别这个问题,而不是让用户在运行时遇到它。请参阅:@ControlAltDel
String.class.getMethod(“compareTo”,String.class)
返回一个方法实例。泛型被删除解释了从
String.class.getMethod(“compareTo”,Object.class)”返回的实例
,但为什么还有带有String.class参数的实例?
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
    Method method = String.class.getMethod("compareTo", Object.class);
    System.out.println(method);
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
    "Foo".compareTo(new Object());
}