2014-06-23 21 views
6

Bây giờ, chúng ta biết rằng Java 8 đã giới thiệu các phương thức mặc định và tĩnh trong các giao diện.
Giao diện ban đầu được giới thiệu trong Java để tránh the diamond problem xảy ra trong C++, trong đa kế thừa.Tùy chọn các lớp trừu tượng trên các giao diện trong Java 8

Nhưng cùng với việc giới thiệu các phương thức mặc định trong giao diện trong Java 8, bây giờ, Java cũng đã giới thiệu vấn đề kim cương mà nó tránh được trong các phiên bản trước.

Phương pháp mặc định không bắt buộc phải được ghi đè.
Nhưng khi một viên kim cương gặp sự cố khi sử dụng giao diện, lớp triển khai các giao diện phải ghi đè các phương thức mặc định.

Vì vậy, bây giờ, tôi có ba câu hỏi trong tâm trí tôi:

  1. Tại sao cần phải có phương pháp mặc định?
  2. Chúng ta không thể có nhiều thừa kế thông qua các lớp, thay vì có các phương thức mặc định trong giao diện?
  3. Và điều gì là cần thiết để tránh vấn đề kim cương trong các phiên bản trước, nếu họ phải giới thiệu nó trong Java 8?

Bất kỳ lời giải thích hay liên kết nào để giải thích?

PS Tôi không tìm thấy bất kỳ liên kết nào trên internet có chứa bất kỳ bài viết hay về điều này.
Tất cả những gì họ nói là một lớp trừu tượng mang lại cho bạn sự cụ thể hơn.
Như trong, các lớp trừu tượng có thể có các hàm tạo nhưng các giao diện không thể. Vì vậy, một lần nữa, tôi muốn biết, Nếu các lớp trừu tượng là cụ thể hơn, và có thể có các nhà thầu,
và anyways Java đã giới thiệu vấn đề kim cương, tại sao chúng ta nên có giao diện bây giờ? Các lớp trừu tượng sẽ không đủ tốt để đứng một mình cho nhiều thừa kế?

+0

thể trùng lặp của ([sự khác biệt giữa các lớp trừu tượng và giao diện trong Java 8? Là gì] http://stackoverflow.com/questions/22591499/what-are-the- khác biệt-giữa-trừu tượng-lớp-và-giao diện-trong-java-8) – assylias

+0

Bản sao này không trả lời câu hỏi của tôi. Vì vậy, tôi sẽ không coi đó là một bản sao. Hãy xem nhận xét thứ ba của câu trả lời JB Nizet để biết thêm thông tin về câu hỏi của tôi. –

Trả lời

15

Không, nó không giới thiệu lại vấn đề kim cương, bởi vì giao diện vẫn không thể có bất kỳ trạng thái nào, và các phương thức mặc định có thể không phải là cuối cùng. Vì vậy, khi bạn chọn triển khai hai giao diện, bạn vẫn có tất cả sự tự do bạn muốn triển khai các phương thức mặc định, bằng cách chọn một trong các triển khai mặc định được cung cấp hoặc bằng cách cung cấp triển khai của riêng bạn. Nhưng bạn sẽ không bao giờ có vấn đề kế thừa trạng thái xung đột từ cả hai giao diện hoặc kế thừa hai phương thức cuối cùng khác nhau và không thể giải quyết xung đột.

Vì vậy, đây là câu trả lời cho câu hỏi của bạn:

  1. Để có thể giới thiệu các phương pháp mới trong giao diện hiện tại mà không phá vỡ tính tương thích ngược: triển khai hiện tại sẽ tự động thực hiện các phương pháp này từ năm triển khai thực hiện của họ là trong giao diện cơ sở .
  2. Không, bởi vì điều đó sẽ giới thiệu một vấn đề kim cương.
  3. không liên quan
+0

Cảm ơn, Nhưng chúng tôi thực sự có tùy chọn để chọn bất kỳ triển khai nào được cung cấp không? Ví dụ, nếu 'interface A' và' interface B' đều có phương thức 'public default void hello()', và 'class Inheritance thực hiện A, B', thì' Inheritance' lớp có một tùy chọn để chọn 'public default void hello() 'từ' giao diện A' và bỏ qua nó từ 'giao diện B' mà không ghi đè nó? –

+1

Có, nó có. 'public void hello() {A.super.hello(); } ' –

+0

Và điều tương tự cũng có thể đạt được với các lớp học. Có 'A' và' B' là các lớp thay cho giao diện, điều tương tự cũng có thể đạt được với chúng. Vì vậy, câu hỏi của tôi vẫn là viết tắt, tại sao chúng ta cần giao diện, nếu cùng một điều có thể đạt được với sự giúp đỡ của các lớp học? Thay cho 'A.super.hello()', chúng ta có thể có một cái gì đó như 'A.superClass.hello()' nếu 'A' và' B' là các lớp và 'Inheritance' mở rộng chúng (Đa thừa kế với các lớp). 'superClass' không có từ khóa. Tôi đang nói nó chỉ để giải thích quan điểm của tôi. –

2

Về điểm 1:

Để hỗ trợ biểu thức lambda cho tất cả các lớp học tập, như forEach phương pháp, nó là cần thiết để thêm một cái gì đó mà sẽ có khả năng tương thích ngược.

xem video này để xem chi tiết Lambda Peak Under the hood

+0

Tôi đã xem video này trước đây. Nhưng điều tương tự có thể đã được thực hiện với sự giúp đỡ của các lớp học. –

+0

Nó sẽ là không thể với các lớp học vì mục đích là cung cấp các lớp hiện có với hành vi mới, mà không thay đổi định nghĩa của chúng. –

Các vấn đề liên quan