AFAIK, extends
kelas dan implements
antarmuka orangtua kelas saya . Tapi saya mengalami situasi, di mana saya tidak bisa menggunakan implements SomeInterface
. Ini adalah deklarasi tipe generik. Sebagai contoh:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
implements
Dilarang menggunakan di sini secara sintaksis. Saya pikir pertama, bahwa menggunakan antarmuka di dalam <> dilarang sama sekali, tetapi tidak. Mungkin saja, saya hanya perlu menggunakan extends
saja implements
. Akibatnya, saya "memperluas" antarmuka. Ini contoh lain berfungsi:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
Bagi saya itu tampaknya sebagai inkonsistensi sintaksis. Tapi mungkin saya tidak mengerti beberapa kemahiran Java 6? Apakah ada tempat lain di mana saya harus memperluas antarmuka? Haruskah antarmuka, yang saya maksudkan untuk diperluas, memiliki beberapa fitur khusus?
sumber
extends
danimplements
, hanya ketika melihat masalah dari perspektif sistem tipe murni, bahwa tidak ada perbedaan.T
kelas?T
dapat mereferensikan tipe antarmuka atauenum
tipe.:
. dan di bawah selimut, sebuah antarmuka adalah dan selalu menjadi kelas abstrak dengan batasan hanya berisiabstract
anggota virtual ( ) yang tidak diimplementasikan , sehingga memungkinkan pewarisan berganda. tidak ada perbedaan antaraimplements
danextends
. keduanya bisa diganti dengan kata yang sama (extends
) atau dengan simbol sewenang-wenang (:
) dan tidak ada yang akan hilang.Ketika Java 5, dan khususnya obat generik, pada awalnya dibuat tersedia untuk pengembang yang telah mendaftarkan minat, sintaksanya sangat berbeda. Alih-alih
Set<? extends Foo>
danSet<? super Bar>
itu telahSet<+Foo>
danSet<-Foo>
. Namun, umpan baliknya adalah tidak jelas apakah+
artinya lebih spesifik atau lebih luas (lebih banyak kelas) . Sun menanggapi umpan balik itu dengan mengubah sintaksis, tetapi dalam batasan tidak memperkenalkan kata kunci baru, yang akan menjadi masalah untuk kompatibilitas ke belakang.Hasilnya adalah keduanya tidak alami. Seperti yang Anda amati,
extends
kelebihan beban untuk berbicara tentang kelas "memperluas" antarmuka, yang bukan bahasa yang digunakan dalam konteks lain; dansuper
kelebihan muatan berarti "adalah superclass", yang merupakan arah yang berlawanan dari hubungan yang sebelumnya diungkapkan oleh kata kunci, yaitu merujuk ke superclass.Namun, dasar-dasar apa antarmuka tidak terpengaruh oleh perubahan ini, dan itu tidak memperkenalkan antarmuka khusus yang diperluas dengan cara baru.
sumber
Ada beberapa kelemahan dalam mengizinkan dan melarang sintaksis semacam itu, dan yang memperbolehkannya jauh lebih besar.
Pikirkan saja itu.
Pemisahan antarmuka dan implementasi adalah salah satu idiom pemrograman mendasar. Karena itu, sintaks yang memungkinkan untuk mengeja "antarmuka mengimplementasikan sesuatu" akan seburuk yang menggunakan tanda plus untuk menunjukkan multiplikasi operan.
sumber
Orang perlu memahami pemrograman berbasis antarmuka sebagai langkah selanjutnya sambil memahami suatu antarmuka. Ini memberitahu apa sebenarnya penggunaan antarmuka. Apa perannya dalam program Java (atau bahasa lainnya).
sumber