Java 8 memperkenalkan metode standar untuk menyediakan kemampuan untuk memperluas antarmuka tanpa perlu memodifikasi implementasi yang ada.
Saya bertanya-tanya apakah mungkin untuk secara eksplisit memanggil implementasi default dari suatu metode ketika metode itu telah ditimpa atau tidak tersedia karena implementasi standar yang bertentangan di antarmuka yang berbeda.
interface A {
default void foo() {
System.out.println("A.foo");
}
}
class B implements A {
@Override
public void foo() {
System.out.println("B.foo");
}
public void afoo() {
// how to invoke A.foo() here?
}
}
Mempertimbangkan kode di atas, bagaimana Anda akan memanggil A.foo()
dari metode kelas B?
Jawaban:
Sesuai artikel ini Anda mengakses metode default di antarmuka
A
menggunakanIni dapat digunakan sebagai berikut (dengan asumsi antarmuka
A
danC
keduanya memiliki metode defaultfoo()
)A
danC
keduanya dapat memiliki.foo()
metode dan implementasi standar spesifik dapat dipilih atau Anda dapat menggunakan satu (atau keduanya) sebagai bagian dari yang barufoo()
metode . Anda juga dapat menggunakan sintaks yang sama untuk mengakses versi default dalam metode lain di kelas implementasi Anda.Deskripsi formal sintaksis metode pemanggilan dapat ditemukan di bab 15 JLS .
sumber
A extends SomeOtherInterface
, danSomeOtherInterface
sudahdefault Type method()
, maka Anda tidak bisa meneleponSomeOtherInterface.super.method()
dari ChildClass saja. Anda hanya dapat memanggil metode default antarmuka yang disebutkan dalamChildClass
'simplements
klausa, bukan orang tua mereka interface' metode.super.super.someMethod();
(karena itu akan mengerikan)Kode di bawah ini akan berfungsi.
Keluaran:
sumber
Jawaban ini ditulis terutama untuk pengguna yang berasal dari pertanyaan 45047550 yang ditutup.
Antarmuka Java 8 memperkenalkan beberapa aspek pewarisan berganda. Metode default memiliki badan fungsi yang diimplementasikan. Untuk memanggil metode dari kelas super, Anda dapat menggunakan kata kunci
super
, tetapi jika Anda ingin membuatnya dengan antarmuka super, Anda harus menyebutkannya secara eksplisit.Keluaran:
sumber
Anda tidak perlu mengganti metode default suatu antarmuka. Sebut saja seperti berikut:
Keluaran:
sumber