首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类::getMethod如何使用Object.class参数?

类::getMethod如何使用Object.class参数?
EN

Stack Overflow用户
提问于 2020-10-13 14:46:08
回答 2查看 67关注 0票数 0
代码语言:javascript
复制
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
    Method method = String.class.getMethod("compareTo", Object.class);
    System.out.println(method);
}

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

代码语言:javascript
复制
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
    "Foo".compareTo(new Object());
}

不编译,因为The method compareTo(String) in the type String is not applicable for the arguments (Object)

为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-13 15:54:52

String实现了Comparable,它定义了方法compareTo(T o)

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

尽管如此,String将该方法实现为compareTo(String o)

因为这有一个不同的签名,所以Java编译器会生成一个“合成的”“桥”方法来使其工作,这意味着您将得到以下结果:

代码语言:javascript
复制
public interface Comparable {
    public int compareTo(Object o);
}

public class String implements Comparable {
    public int compareTo(String o) {
        ...
    }
    public synthetic bridge int compareTo(Object o) {
        return compareTo((String) o);
    }
}

当然,syntheticbridge不是您可以放在Java源文件中的实际关键字,但是这些修饰符在运行时存在于反射数据中。

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

但是,您可以通过反射看到该方法,但正如您从这里显示的实现中可以看到的那样,如果您实际上通过反射调用compareTo(new Object()),那么您将得到一个ClassCastException

票数 1
EN

Stack Overflow用户

发布于 2020-10-13 14:52:55

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64337492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档