在没有方法重载的语言中,方法由其在该类中的名称唯一标识(暂时忽略覆盖)。
但在 Java 中情况有些不同。引用自甲骨文文档 https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html:
重载方法
Java编程语言支持重载方法,并且Java可以区分具有不同方法签名的方法。这意味着,如果类中的方法具有不同的参数列表,则它们可以具有相同的名称(对此有一些限定条件,将在标题为“接口和继承”的课程中讨论)。
所以我们知道方法也是通过它们的签名来识别的。如果两个方法共享一个名称但没有相同的签名,那么它们是不同的方法。不要让他们的共同名字欺骗您,让您认为他们有某种联系。
考虑到这一事实,我们可以轻松创建一个示例,其中如果方法的行为符合您所描述的方式,则会发生未定义的行为:
Ball ba = (boolean miss) -> System.out.println(miss);
someFunction(ba)
public void someFunction(Ball ball) {
ball.hit();
}
在这种情况下您会期望什么行为?这是未定义的!
但是,您可以利用默认方法 https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html。我不太了解您的情况,无法判断这是否合适,但您可以这样做:
@FunctionalInterface
public interface Ball
{
default void hit() {
hit(true);
}
void hit(boolean miss);
}
为什么这有效的解释在的文档FunctionalInterface https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html:
从概念上讲,函数式接口只有一个抽象方法。由于默认方法有一个实现,因此它们不是抽象的