В языках без перегрузки методов методы однозначно идентифицируются по имени в этом классе (на данный момент игнорируя переопределение).
В Java все немного по-другому.Цитирование из oracle docs :
Методы перегрузки
Язык программирования Java поддерживает методы перегрузки, и Java может различать методы с помощьюподписи разных методов.Это означает, что методы в классе могут иметь одно и то же имя, если они имеют разные списки параметров (есть некоторые уточнения к этому, которые будут обсуждаться в уроке под названием «Интерфейсы и наследование»).
Итакмы знаем, что методы также идентифицируются по их подписи.Если два метода имеют общее имя, но не имеют одинаковую сигнатуру, это разные методы .Не позволяйте их общему имени вводить вас в заблуждение, думая, что они каким-то образом связаны.
Учитывая этот факт, мы можем легко создать пример, в котором неопределенное поведение могло бы произойти, если бы методы вели себя так, как вы описали:
Ball ba = (boolean miss) -> System.out.println(miss);
someFunction(ba)
public void someFunction(Ball ball) {
ball.hit();
}
Какое поведение вы ожидаете в этом случае?Это не определено!
Вы можете - однако - использовать методы по умолчанию .Я не знаю вашу ситуацию достаточно хорошо, чтобы судить, подходит ли этот подход, но вы можете сделать это:
@FunctionalInterface
public interface Ball
{
default void hit() {
hit(true);
}
void hit(boolean miss);
}
Почему это объясняется в документации для FunctionalInterface
:
Концептуально функциональный интерфейс имеет ровно один абстрактный метод.Поскольку методы по умолчанию имеют реализацию, они не являются абстрактными