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
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>
.
Neden Java statik olarak bir sınıf bil...
Neden't Java değil jenerik şeyleş...
Neden Java Vector sınıfı eski veya kul...
Neden Java'In hashCode() Dize çar...
Neden oluştur "Örtülü olarak Opti...