2016-01-30 11 views
5
List<? extends String> list = new Arraylist<String>(); 
list.add("foo"); 

Verilen kod parçası bana derleme zamanı hatası verir. ama kodu, String sınıfı nesnesi ekleyebilir ve hala ben hata alıyorum listede içinde türetilmiş sınıf nesnesi demektir nedenListe joker karakterini kullanırken zaman hatası derle

+1

Gerçekten 'String' bir ** final ** sınıfı olduğu için mantıklı değil! 'String' uzatabilecek bir sınıf yoktur. Yani, yapmanız gereken tek şey onu 'List 'olarak tanımlamak. – bobbel

+0

ancak nesne olarak String olan ArrayList referansını nasıl alıyor? –

+0

'List ' Listesini yerine getirdi 'öğesini genişletir. Fark * String bir String'dir * ancak * String bir olmayabilir? Bu bir String *. – Linus

cevap

2

öğelerin veri türüyle önemli olmadığında List<?> sadece kullanılmalıdır ve,

public int getSize(List<?> itemList) { 
    return itemList.size(); 
} 

bir Read Only listesindeki daha fazla olacak şekilde listede vb Örnek için

inerek boyutu olarak etmekle ilgilenen. Eğer String öğelerin yeni bir listesini yapmak niyetinde

Aşağıdaki kullanıyor olmalıdır. Alternatif

List<String> list = new Arraylist<>(); 
list.add("foo"); 

, bu kullanabilirsiniz:

List<Object> list = new Arraylist<>(); 
list.add("foo"); 
1

Bu çalışacaktır:

List<? super String> list = new ArrayList<String>(); 
list.add("foo"); 

Sonra derleyici şimdi, arayan olduğunu vardır nesnelerin listesini geçmek olacak String veya bir süper tipi. Eğer <? extends String> derken

buna String genişleten herhangi türde olabileceği anlamına gelir. Bu, birinin List kodunu geçebileceği ve kabul edeceği anlamına gelir. Ayrıca burada

Görünüş: Difference for <? super/extends String> in method and variable declaration

1

Esasen List<? extends String> bilinmeyen türde bir listesi olduğunu, bilindiği tüm bu tip Dize uzanır olmasıdır. Değişkenin List<String> örneğini içermesi önemli değildir. A bir alt sınıf B bazı sınıftır

List<? extends A> list = new ArrayList<A>(); 

: o yüzden düşünelim ...

Şimdi dize kesindir, bu nedenle alt sınıf yoktur. kullanıldığında, tip List<? extends A> bir değişken List<B> örneğidir olabilir. Bir A bir B değil olasılığı vardır çünkü buna A ekleyemezsiniz.

Ama bunun doğru olacağını biliyorum? Peki, derleyici değil, bilinmeyen tür ve başlattıklarınız arasındaki mantıksal bağlantıları da öngörmez, çünkü genel olarak bu değişkeni çalışma zamanında değiştirebilirsiniz.

benzer bir örnek için bir yöntem (Set<T>, T) kabul eder ve yasadışı arama Set<?> değişken Set<String> bir örneğini içerir rağmen (Set<?>, String) kullanılarak preposed edilir iyimser More Fun with Wildcards adlı öğretici bulunmaktadır. Sorun, extends eklenmesine rağmen burada aynıdır.

İlgili konular