? extends HasWord
"Genişleyen bir sınıf / arabirim" anlamına gelir HasWord. Başka bir deyişle, HasWordkendisi veya çocukları ... temelde instanceof HasWordartı 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 Listbireyin 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ı ListListenin kendisini yeniden sıralamak için.