接口的想法是它们指定一个类可以实现的契约。您阅读的另一篇文章主要介绍了这个想法。
仅仅直接从接口实现方法是不够的,因为其他方法可以使用接口类型来要求这些方法存在。
让我们以AutoCloseable为例。唯一的方法是 close 方法,但使用类型来表达“我需要一个可以关闭的参数”的想法比列出所有方法要容易得多:
public void passMeSomethingThatICanClose(AutoCloseable bar) {
//stuff goes here
bar.close(); //the compiler knows this call is possible
}
如果我们没有简洁的类型名称,方法就必须明确列出需求,这不是很容易,尤其是当接口“契约”有很多方法时。
这也适用于另一种方式。通过使用特定的关键字“implements AutoCloseable”来表示意图,编译器可以告诉您您是否没有正确实现合同。
public class BrokenCloseable implements AutoCloseable {
public void colse() { //ERROR — see the typo?
//blah
}
}
这是一个错误,因为该方法的名称错误。在 Java 中,编译器可以(并且将会)告诉您这一点。但是如果你只负责自己实现这些方法,你就不会出错。相反,您的班级只会默默地“不能”自动关闭。
其他一些语言(Python 是一个很好的例子)不会以这种方式做事——而是按照您在问题中建议的方式做事。这就是所谓的“鸭子打字”(如果它看起来像鸭子,而嘎嘎叫的像鸭子,那就把它当作鸭子对待),它也是一种可行的做事方式,只是与 Java 不同。