java - 为什么我不应该在实现它们时更改接口方法名称?
问题描述
假设我正在使用 Runnable 接口,
Runnable runnable = new Runnable() {
@Override
public void run() {
// some code
}
};
如果 Runnable 接口中的 run() 方法是空的,为什么我们要在代码中使用 @Override 和相同的名称,而不是只为我们的实现使用随机名称,例如,
Runnable runnable = new Runnable() {
public void myRun() {
// some code
}
};
这个问题可能看起来很愚蠢,但我是编程新手!
解决方案
Runnable 只有一种方法,因此,您可能会认为方法名称无关紧要。但是大多数接口都有不止一种方法。例如,java.util.Iterator
它有 2 个(嗯,4 个,但其中 2 个具有默认实现,因此您不需要实现这些。重点是,您必须实现 2 个)。
因此,假设不是命名您的两个方法next
and hasNext
,而是命名它们jill
and 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();
推荐阅读
- node.js - 如何获取一天的所有小时数据?
- python - 使用 Beautiful soup 从 XML 文件中提取数据帧
- python-3.x - 我试图通过在while循环之外创建一个函数来简化我的代码,但是我想放入函数的条件有break语句
- vaadin - 将 Vaadin 组件与 snowpack 一起使用
- python - Python代码优化问题(Lintcode Problem 1886 Moving Targets)
- python - 如何将数据框的列类型放入列表中?
- c++ - C++ 通过在文件名中查找版本来删除旧文件
- django - AttributeError 'Model' 对象没有属性 'get_FOO_dispay'
- python - AttributeError: 'int' object has no attribute 'value' - 关于“神经风格音频传输”的问题
- mysql - 通过引用另一个表将表连接回自身的 SQL 子查询