Giao diện bên dưới có phải là giao diện chức năng hợp lệ trong Java 8 không?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
Tại sao nó không cho tôi một lỗi thời gian biên dịch?
Giao diện bên dưới có phải là giao diện chức năng hợp lệ trong Java 8 không?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
Tại sao nó không cho tôi một lỗi thời gian biên dịch?
Câu trả lời:
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à Normalcó 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 publicvì 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 toStringthành một tên khác, ví dụ toStringX, bạn sẽ thấy rằng do @FunctionalInterfacecó 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
Trước hết, Nitin, bạn cần có một nghiên cứu thích hợp về vấn đề này, và sau đó bạn nên đến nền tảng này để hỏi về vấn đề của mình.
Tuy nhiên, trước hết, hãy để tôi xóa nghi ngờ của bạn về Giao diện chức năng trong Java 8
- Giao diện chức năng trong Java 8 chỉ có thể có một phương thức trừu tượng và bất kỳ số phương thức mặc định nào.
- Từ Java 8 trở đi, các biểu thức lambda có thể được sử dụng để thể hiện thể hiện của giao diện chức năng.
- Chú thích @FunctionalInterface được sử dụng để đảm bảo rằng giao diện chức năng không thể có nhiều hơn một phương thức trừu tượng. Trong trường hợp có nhiều hơn một phương thức trừu tượng, trình biên dịch sẽ đánh dấu một
Unexpected @FunctionalInterface annotationthông báo. Tuy nhiên, không bắt buộc phải sử dụng chú thích này.
Theo mã của bạn, tôi có thể thấy hai phương thức trừu tượng, do đó mã của bạn không hợp lệ .
Tôi hy vọng điều đó sẽ giúp bạn một cách nào đó. Để biết thêm thông tin, vui lòng xem liên kết này: Giao diện chức năng Java 8