? extends HasWord
berarti "Kelas / antarmuka yang memanjang HasWord
." Dengan kata lain, HasWord
itu sendiri atau salah satu dari anak-anaknya ... pada dasarnya apa pun yang sesuai dengan instanceof HasWord
plus null
.
Dalam istilah yang lebih teknis, ? extends HasWord
adalah wildcard terbatas, tercakup dalam Item 31 dari Java Edisi 3 Efektif , mulai dari halaman 139. Bab yang sama dari Edisi 2 tersedia online dalam bentuk PDF ; bagian pada wildcard terbatas adalah Item 28 mulai dari halaman 134.
Pembaruan: Tautan PDF telah diperbarui sejak Oracle menghapusnya beberapa waktu lalu. Sekarang menunjuk ke salinan yang dipandu oleh Sekolah Teknik Elektronika dan Ilmu Komputer Queen Mary University London.
Pembaruan 2: Mari kita sedikit lebih detail tentang mengapa Anda ingin menggunakan wildcard.
Jika Anda mendeklarasikan metode yang tanda tangannya ingin Anda lewati List<HasWord>
, maka satu-satunya hal yang dapat Anda lewati adalah a List<HasWord>
.
Namun, jika tanda tangan itu List<? extends HasWord>
maka Anda bisa lewat List<ChildOfHasWord>
.
Perhatikan bahwa ada perbedaan tipis antara List<? extends HasWord>
dan List<? super HasWord>
. Seperti yang dikatakan Joshua Bloch: PECS = produsen-meluas, konsumen-super.
Apa artinya ini adalah bahwa jika Anda meneruskan koleksi yang metode Anda tarik data dari (yaitu koleksi menghasilkan elemen untuk metode Anda untuk menggunakan), Anda harus menggunakan extends
. Jika Anda meneruskan koleksi yang ditambahkan metode Anda ke data (mis. Koleksi tersebut menggunakan elemen yang dibuat metode Anda), itu harus digunakan super
.
Ini mungkin terdengar membingungkan. Namun, Anda dapat melihatnya di List
's sort
perintah (yang hanya jalan pintas untuk versi dua-arg dari Collections.sort). Alih-alih mengambil Comparator<T>
, itu sebenarnya membutuhkan Comparator<? super T>
. Dalam hal ini, Pembanding mengkonsumsi elemen-elemen List
untuk menyusun ulang Daftar itu sendiri.