假设我正在使用一个 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 个)。
所以,假设您不将两个方法命名为 next
和 hasNext
,而是将它们命名为 jill
和 jane
代替。
编译器或任何调用者应该如何确定哪个执行 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/