Giả sử có hai giao diện Interface1
và Interface2
trong đó Interface2
mở rộng Interface1
.Các phương thức và giao diện mặc định mở rộng các giao diện khác
interface Interface1 {
default void method() {
System.out.println("1");
}
// Other methods
}
interface Interface2 extends Interface1 {
@Override
default void method() {
System.out.println("2");
}
// Other methods
}
Giả sử tôi muốn tạo ra một lớp mà thực hiện Interface2
nhưng tôi muốn method()
là phiên bản trong Interface1
. Nếu tôi viết
class MyClass implements Interface1, Interface2 {
public void method() {
Interface1.super.method();
}
}
tôi nhận được lỗi biên dịch:
bad type qualifier in default super call: redundant interface Interface1 is extended by Interface2
Có thể làm được việc này bằng cách tạo ra một giao diện thứ ba:
interface Interface3 extends Interface1 {
default void method() {
Interface1.super.method();
}
}
Sau đó:
class MyClass implements Interface1, Interface2, Interface3 {
public void method() {
Interface3.super.method();
}
}
Việc biên dịch này tốt và nếu tôi tham gia stantiate một MyClass
mới và gọi method()
, đầu ra là 1
như mong đợi. Vì vậy, câu hỏi của tôi là, cho rằng nó là như vậy dễ dàng để có được xung quanh hạn chế mà bạn chỉ có thể viết InterfaceName.super.method()
cho giao diện cụ thể nhất trong một chuỗi, lý do cho việc hạn chế là những gì ?. Những vấn đề gì được ngăn cản bằng cách không cho phép bạn viết Interface1.super.method()
ngay từ đầu?
Nếu 'Interface2 kéo dài Interface1', trong đó kịch bản bạn muốn có một lớp để thực hiện chúng * cả *? – Maroun
@MarounMaroun Bạn nói đúng, không có điểm nào viết cả hai. Nó chỉ là trên IntelliJ tôi nhận được một thông báo lỗi ít hữu ích nếu tôi chỉ viết 'Interface2'. –
các phương thức trong 'giao diện' có phần thân, đoán tôi phải sửa lại những điều cơ bản của mình. Tôi nghĩ rằng họ được cho là trừu tượng –