Di Antarmuka Koleksi saya menemukan metode bernama removeIf()
yang berisi implementasinya.
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
Saya ingin tahu apakah ada cara untuk mendefinisikan tubuh metode dalam sebuah antarmuka?
Apa default
kata kuncinya dan bagaimana cara kerjanya?
Jawaban:
Dari https://dzone.com/articles/interface-default-methods-java
public interface A { default void foo(){ System.out.println("Calling A.foo()"); } } public class ClassAB implements A { }
Ada satu pertanyaan umum yang orang tanyakan tentang metode default ketika mereka mendengar tentang fitur baru untuk pertama kalinya:
Contoh untuk menggambarkan situasi ini:
public interface A { default void foo(){ System.out.println("Calling A.foo()"); } } public interface B { default void foo(){ System.out.println("Calling B.foo()"); } } public class ClassAB implements A, B { }
Kode ini gagal untuk dikompilasi dengan hasil berikut:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Untuk memperbaikinya, di Clazz, kita harus menyelesaikannya secara manual dengan mengganti metode yang bertentangan:
public class Clazz implements A, B { public void foo(){} }
Tetapi bagaimana jika kita ingin memanggil implementasi default metode foo () dari antarmuka A daripada mengimplementasikannya sendiri.
Dimungkinkan untuk merujuk ke A # foo () sebagai berikut:
public class Clazz implements A, B { public void foo(){ A.super.foo(); } }
sumber
Metode tersebut disebut metode default. Metode default atau metode Defender adalah salah satu fitur yang baru ditambahkan di Java 8.
Mereka akan digunakan untuk memungkinkan metode antarmuka menyediakan implementasi yang digunakan sebagai default jika kelas konkret tidak menyediakan implementasi untuk metode itu.
Jadi, jika Anda memiliki antarmuka, dengan metode default:
public interface Hello { default void sayHello() { System.out.println("Hello"); } }
Kelas berikut sangat valid:
public class HelloImpl implements Hello { }
Jika Anda membuat instance dari
HelloImpl
:Hello hello = new HelloImpl(); hello.sayHello(); // This will invoke the default method in interface
Tautan Berguna:
sumber
Saya melakukan sedikit riset dan saya menemukan yang berikut ini. Semoga ini membantu.
Metode antarmuka normal dideklarasikan sebagai abstrak dan harus didefinisikan di kelas yang mengimplementasikan antarmuka. Ini 'membebani' pelaksana kelas dengan tanggung jawab untuk mengimplementasikan setiap metode yang dideklarasikan. Lebih penting lagi, ini juga berarti bahwa memperluas antarmuka tidak mungkin dilakukan setelah 'publikasi'. Jika tidak, semua pelaksana harus menyesuaikan implementasinya, memutus sumber mundur dan kompatibilitas biner.
Untuk mengatasi masalah ini, salah satu fitur baru JDK 8 adalah kemungkinan untuk memperluas antarmuka yang ada dengan metode default. Metode default tidak hanya dideklarasikan, tetapi juga ditentukan di antarmuka.
sumber