? extends HasWord
berarti "Kelas / antarmuka yang memanjang HasWord." Dengan kata lain, HasWorditu sendiri atau salah satu dari anak-anaknya ... pada dasarnya apa pun yang sesuai dengan instanceof HasWordplus null.
Dalam istilah yang lebih teknis, ? extends HasWordadalah 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 sortperintah (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 Listuntuk menyusun ulang Daftar itu sendiri.