То, что Alok процитировано, верно, но он что-то упустил, что делает его окончательный ответ (что код неверен) неверным:
Интерфейс имеет один метод String toString()
, который каждый класс уже реализует, наследуя его от Object
. Т.е. заявленный интерфейсный метод уже имеет реализацию, аналогичную методу по умолчанию. Следовательно, нет ошибки компиляции, и Normal
может использоваться как функциональный интерфейс, как показано в моем MCVE :
package de.scrum_master.stackoverflow;
@FunctionalInterface
interface Normal {
String move();
String toString();
}
Кстати, нет необходимости объявлять методы интерфейса как public
потому что они всегда есть. То же самое касается abstract
.
package de.scrum_master.stackoverflow;
public class NormalApp {
static void doSomething(Normal normal) {
System.out.println(normal.move());
System.out.println(normal.toString());
}
public static void main(String[] args) {
doSomething(() -> "xxx");
}
}
Если вы запустите приложение драйвера, вы увидите этот журнал консоли:
xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5
Теперь, если вы измените имя метода toString
на что-то еще, например toStringX
, вы увидите, что из-за @FunctionalInterface
появляется ожидаемое сообщение об ошибке при компиляции класса:
Unexpected @FunctionalInterface annotation
de.scrum_master.stackoverflow.Normal is not a functional interface
multiple non-overriding abstract methods found in interface de.scrum_master.stackoverflow.Normal