Những gì Alok trích dẫn là đúng, nhưng anh ta đã bỏ qua điều gì đó, khiến câu trả lời cuối cùng của anh ta (rằng mã không hợp lệ) sai:
Giao diện có một phương thức String toString()
mà mọi lớp đã thực hiện, kế thừa nó từ đó Object
. Tức là phương thức giao diện đã khai báo đã có triển khai, tương tự như phương thức mặc định. Do đó, không có lỗi biên dịch và Normal
có thể được sử dụng như một giao diện chức năng như được hiển thị trong MCVE của tôi :
package de.scrum_master.stackoverflow;
@FunctionalInterface
interface Normal {
String move();
String toString();
}
BTW, không cần phải khai báo các phương thức giao diện public
vì chúng luôn như vậy. Cùng đi cho 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");
}
}
Nếu bạn chạy ứng dụng trình điều khiển, bạn sẽ thấy nhật ký giao diện điều khiển này:
xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5
Bây giờ nếu bạn thay đổi tên phương thức toString
thành một tên khác, ví dụ toStringX
, bạn sẽ thấy rằng do @FunctionalInterface
có thông báo lỗi dự kiến khi biên dịch lớp:
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