Tại sao không có lỗi biên dịch cho @FactoralInterface của tôi với hai phương thức?


8

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?


Tại sao nó không cho tôi biên dịch lỗi thời gian
Nitin T

Bạn có thể vui lòng chia sẻ nhật ký của nền tảng mà bạn đang chạy mã của mình không?
Alok

1
Câu hỏi thú vị. Tôi không hiểu các phiếu bầu gần. Nhưng Nitin, hãy học cách viết những câu hỏi hay. Không chỉ đăng mã, cũng đặt câu hỏi thực tế vào văn bản của bạn, không phải vào tiêu đề hoặc chỉ nhận xét. Và chỉnh sửa câu hỏi thay vì bình luận nếu bạn muốn thêm một cái gì đó vào câu hỏi. Tôi sẽ làm điều đó cho bạn lần này. Cũng xin được khuyên học cách sử dụng các khối mã, tôi cũng đã sửa định dạng mã của bạn.
kriegaex

Tóm lại: Khai báo bắc cầu của các phương thức.
Vishwa Ratna

Câu trả lời:


10

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

Câu trả lời tuyệt vời Kriegaex.
Alok

1
Giải thích tuyệt vời, +1
Sandeep Tiwari

-1

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

  1. 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.
  2. 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.
  3. 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


1
alok bạn không hiểu câu hỏi của tôi nếu @FactoralInterface đảm bảo trình biên dịch rằng giao diện của tôi chỉ có một phương thức trừu tượng thì tại sao mã trên không cho tôi biên dịch lỗi thời gian, tôi chỉ cần một câu trả lời cho điều đó
Nitin T

@NitinT, xem trong báo cáo vấn đề của bạn những gì bạn đã viết hợp lệ hay không . Tôi đã đưa ra câu trả lời dựa trên điều này. Vui lòng thực hiện một số nghiên cứu về việc đặt câu hỏi trên StackOverFlow.
Alok
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.