SORU
30 NİSAN 2010, Cuma


Liste<Köpek> Listenin alt<Hayvan>? Neden''In jenerik t Java örtülü olarak polimorfik değil mi?

Biraz Java jenerik miras / polimorfizmi kolu hakkında kafam karıştı.

Aşağıdaki hiyerarşi olduğunu düşünüyorum

Hayvan(Üst)

Köpek-Kedi(Çocuk)

Bir yöntemi var sanırım doSomething(List<Animal> animals). Veraset ve polimorfizmi kurallarına göre, List<Dog> varsayılabilirList<Animal> List<Cat>List<Animal> - ve bu yüzden de bir tek bu yönteme geçirildi. Çok değil. Eğer bu davranış elde etmek istiyorum, açıkça doSomething(List<? extends Animal> animals) diyerek Hayvanın herhangi bir alt listesini kabul etmek için bir yöntem söyleyeyim.

Bu Java davranış olduğunu anlıyorum. Benim sorumneden? Neden belirtilmelidir jenerik geldiğinde genellikle örtülü polimorfizmi, ama?

CEVAP
30 NİSAN 2010, Cuma


Hayır, List<Dog>değil8**. Ne yapabilirim List<Animal> - ekleyebilirsiniz bir düşününherhangi birbir kedi de dahil olmak üzere hayvan.... Şimdi, mantıksal olarak yavru bir çöp için kedi ekleyebilir misin? Kesinlikle değil.

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new List<Dog>();
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

Aniden bir varçokkedi kafası karışık.

Şimdi, senolamazList<Cat> bir şey bilmiyorsun çünkü List<? extends Animal> Cat ekleyin. Bir değer almak ve Animal ama keyfi hayvanlar ekleyemezsiniz bir olacağını biliyor. Tersi doğru List<? super Animal> - o halde ekleyebileceğiniz bir Animal bunu güvenli bir şekilde, ama bilmediğin bir şey hakkında ne olabileceğini alınır, çünkü bu olabilir List<Object>.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • huyked

    huyked

    28 Mart 2008