java - 为什么我不应该在实现它们时更改接口(interface)方法名称?

标签 java

假设我正在使用一个 Runnable 接口(interface),

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // some code

    }
};

如果 Runnable 接口(interface)中的 run () 方法是空的,为什么我们要在代码中使用 @Override 和相同的方法名称,而不是像这样为我们的实现使用随机名称,

Runnable runnable = new Runnable() {
    public void myRun() {
        // some code

    }
};

这个问题可能看起来很愚蠢,但我是编程新手!

最佳答案

Runnable 只有一个方法,因此,您可能会认为方法名称无关紧要。但是大多数接口(interface)都有不止一种方法。例如,java.util.Iterator其中有 2 个(好吧,4 个,但其中 2 个具有默认实现,因此您不需要实现它们。重点是,您必须实现 2 个)。

所以,假设您不将两个方法命名为 nexthasNext,而是将它们命名为 jilljane 代替。

编译器或任何调用者应该如何确定哪个执行 hasNext 作业以及哪个执行下一个作业?看看签名?如果您的接口(interface)有 2 个具有完全相同签名的不同方法怎么办?

不可能。这就是名称需要匹配的原因:它们用于查找。

是的,如果接口(interface)只有一个名称,您会认为编译器/调用者可以:是的,好吧,它拥有的唯一方法,就是那个。但这不是它的工作方式 - 如果您避免只为简化的情况制造异常,语言设计会更简单。

请注意,java 具有 lambda 语法,它仅在接口(interface)具有一个方法时有效,并且完全省略了方法名称以及参数类型。除了你的 myRun 方法,你也可以这样写:

Runnable r = () -> /* some code */;

不需要new Runnable() { public void myRun,也不需要}}。如果 myRun 有参数,您甚至不需要添加它们的类型,只需添加它们的名称。例如,Comparator,它有参数:

长格式:

Comparator<String> lengthComparator = new Comparator<String>() {
    @Override public int compare(String a, String b) {
        return a.length() - b.length();
    }
};

可以写得更短:

Comparator<String> lengthComparator = (a, b) -> a.length() - b.length();

关于java - 为什么我不应该在实现它们时更改接口(interface)方法名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65299443/

相关文章:

java - 如何将两个列表中的每个元素连接到一个新列表?

java - 发送 POST 并读取流响应

Java Swing 我怎样才能完成像示例中这样的导航器

java - 静态同步方法

java - 模拟器不显示任何内容

java - Gson不反序列化JSON数据

java - 如何在java web项目中配置自定义日志文件

java - 如何使用 Spring $$EnhancerBySpringCGLIB$$ 捕获异常?

java - Java中Json解析,返回主要元素

java - 在异步任务之后用另一个 fragment 替换一个 fragment