首页 > 解决方案 > 为什么我不应该在实现它们时更改接口方法名称?

问题描述

假设我正在使用 Runnable 接口,

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

    }
};

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

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

    }
};

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

标签: java

解决方案


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

因此,假设不是命名您的两个方法nextand hasNext,而是命名它们jilland jane

编译器或任何调用者应该如何确定哪个执行 hasNext 作业以及哪个执行下一项作业?看签名?如果你的界面有 2 种不同的方法,签名完全相同怎么办?

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

是的,如果接口只有一个名称,您会认为编译器/调用者可以直接使用:是的,嗯,它拥有的唯一方法,就是这个。但这不是它的工作原理——如果您避免仅针对简化案例进行例外处理,则语言设计会更简单。

请注意,java 具有 lambda 语法,它仅在接口具有一个方法时才有效,并且完全省略了方法名称以及参数类型。除了你的 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();

推荐阅读