? extends HasWord
"Genişleyen bir sınıf / arabirim" anlamına gelir HasWord
. Başka bir deyişle, HasWord
kendisi veya çocukları ... temelde instanceof HasWord
artı ile çalışacak her şey null
.
Daha teknik terimlerle, sayfa 141'den başlayarak Etkili Java 3. Baskı'nın? extends HasWord
31. maddesinde yer alan sınırlı bir joker karakterdir . 2. Baskıdaki aynı bölüm PDF olarak çevrimiçi olarak mevcuttur ; sınırlı joker karakterler üzerindeki kısım sayfa 134'den başlayarak Madde 28'dir.
Güncelleme: Oracle bağlantısı bir süre önce kaldırdığından beri PDF bağlantısı güncellendi. Şimdi Londra Kraliçe Mary Üniversitesi Elektronik Mühendisliği ve Bilgisayar Bilimleri Okulu'nun ev sahipliği yaptığı kopyaya işaret ediyor.
Güncelleme 2: Neden joker karakterler kullanmak istediğinize dair biraz daha ayrıntıya girelim.
İmzası sizden geçmeyi bekleyen bir yöntem bildirirseniz, iletebileceğiniz List<HasWord>
tek şey bir List<HasWord>
.
Ancak, söz konusu imza olsaydı, bunun yerine List<? extends HasWord>
bir pas geçebilirdiniz List<ChildOfHasWord>
.
List<? extends HasWord>
Ve arasında ince bir fark olduğunu unutmayın List<? super HasWord>
. Joshua Bloch'un söylediği gibi: PECS = üretici-genişletiyor, tüketici-süper.
Bunun anlamı, yönteminizin verileri çıkardığı bir koleksiyondan geçiyorsanız (yani koleksiyon, yönteminizin kullanması için öğeler üretiyorsa) kullanmanızdır extends
. Yönteminizin veri eklediği bir koleksiyondan geçiyorsanız (yani koleksiyon, yönteminizin oluşturduğu öğeleri tüketiyorsa) kullanmalıdır super
.
Bu kafa karıştırıcı gelebilir. Ancak, görebiliyorum List
bireyin sort
(Collections.sort iki-arg sürümü için sadece bir kısayol olan) komutu. Bir almak yerine, Comparator<T>
aslında bir Comparator<? super T>
. Bu durumda, Karşılaştırıcı List
Listenin kendisini yeniden sıralamak için.