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

  • BlackBoxTV

    BlackBoxTV

    7 Mayıs 2007
  • guillaume2111's channel

    guillaume211

    19 Kasım 2006
  • RobertDuskin

    RobertDuskin

    12 HAZİRAN 2008