27 Mayıs 2019 Pazartesi

Covariant Nesne Atama - Covariance

Giriş
<? extends Animals> şeklindeki generics bir çok kısıtlama ile geliyor

1.  <? extends Animal> listesi <Animal> listesine cast edilemez
2. <Animal> listesi Dog taşısa bile <Dog> listesine cast edilemez.

Örnek - Ekleme Yapılamaz
Elimizde şöyle bir kod olsun. animals listesine add() ile ekleme yapılamaz.
List<? extends Animal> animals = new ArrayList<Cat>();
//animals.add(new Cat()); // compile error
//animals.add(new Animal()); // compile error
Animal animal = animals.get(0);
Örnek - Ata Tipten Collection'a Cast Etme
Şu kod derlenmez.
List<? extends Animal> foo() {
  List<Dog> dogs = new ArrayList<>();
  return dogs;
}

List<Animal> dogs = foo(); // compile error
Sebebi ise bir kaç katmanlı cast kullanarak atama yapılmasının yanlış olması. Örneğin bu iş olsaydı şu kod hatalı olurdu. Cat listesini Animal listesine cast edip, Animal listesine Dog ekleme mümkün olurdu.
List<Cat> listOfCats = new ArrayList<>();
List<? extends Animal> listOfSomeAnimals = listOfCats;  // Fine.
List<Animal> listOfAnimals = listOfSomeAnimals;  // Error, pretend it works.
listOfAnimals.add(new Dog());


Hiç yorum yok:

Yorum Gönder