Saya punya beberapa pertanyaan tentang wildcard generik di Java:
Apa perbedaan antara
List<? extends T>
danList<? super T>
?Apa itu wildcard terbatas dan apa itu wildcard tak terbatas?
java
generics
bounded-wildcard
Pablo Fernandez
sumber
sumber
Jawaban:
Di pertanyaan pertama Anda,
<? extends T>
dan<? super T>
merupakan contoh karakter pengganti berbatas. Karakter pengganti tak terbatas terlihat seperti<?>
, dan pada dasarnya berarti<? extends Object>
. Ini secara longgar berarti generik dapat jenis apa saja. Karakter pengganti yang dibatasi (<? extends T>
atau<? super T>
) menempatkan batasan pada tipe dengan mengatakan bahwa itu harus memperluas tipe tertentu (<? extends T>
dikenal sebagai batas atas), atau harus merupakan leluhur dari tipe tertentu (<? super T>
dikenal sebagai batas bawah) .Tutorial Java memiliki beberapa penjelasan generik yang cukup bagus di artikel Wildcard dan More Fun with Wildcard .
sumber
<? super C>
berarti tipe Anda dibatasi untuk sesuatuC
di atas dalam hierarki tipe. (Maaf atas balasan yang sangat terlambat. Saya kira kami tidak memiliki pemberitahuan komentar 2 tahun yang lalu?)Jika Anda memiliki hierarki kelas A, B adalah subkelas A, dan C dan D keduanya adalah subkelas B seperti di bawah ini
Kemudian
Karakter pengganti terikat seperti di
? extends B
mana B adalah tipe tertentu. Artinya, jenisnya tidak diketahui tetapi "terikat" dapat ditempatkan di atasnya. Dalam hal ini, itu dibatasi oleh beberapa kelas, yang merupakan subkelas dari B.sumber
List<? super B>
menggambarkan sebagai Daftar menerima tipe yang merupakan kelas induk dari kelas B ? Itulah mengapa C dan D tidak dapat dikompilasi hmm?Josh Bloch juga memiliki penjelasan yang baik tentang kapan harus menggunakan
super
danextends
dalam obrolan video google io ini di mana dia menyebutkan mnemonic Produsenextends
Konsumensuper
.Dari slide presentasi:
sumber
Ada kalanya Anda ingin membatasi jenis jenis yang diizinkan untuk diteruskan ke parameter jenis. Misalnya, metode yang beroperasi pada angka mungkin hanya ingin menerima instance Number atau subclassnya. Untuk inilah parameter tipe terikat.
berarti ia dapat menerima semua objek yang memiliki hubungan IS- A dengan MyObject (yaitu objek apa pun yang merupakan tipe myObject atau kita dapat mengatakan objek apa pun dari subkelas MyObject) atau objek kelas MyObject.
Sebagai contoh:
Kemudian,
hanya akan menerima MyObject atau anak-anak dari MyObject (yaitu setiap objek bertipe OurObject atau YourObject atau MyObject, tetapi bukan objek superclass dari MyObject).
sumber
Secara umum,
Untuk memasukkan elemen ke dalam struktur, kita membutuhkan jenis karakter pengganti lain yang disebut
Wildcards with super
,sumber
Karakter pengganti umum dibuat untuk membuat metode yang beroperasi di Koleksi lebih dapat digunakan kembali.
Misalnya, jika suatu metode memiliki parameter
List<A>
, kita hanya dapat memberikannyaList<A>
kepada metode ini. Ini adalah pemborosan untuk fungsi metode ini dalam beberapa keadaan :List<A>
, maka kita harus diizinkan untuk memberikanList<A-sub>
metode ini. (Karena A-sub ADALAH A)List<A>
, maka kita harus diizinkan untuk memberikanList<A-super>
ke metode ini. (Karena A ADALAH A-super)sumber