ProgramlamaOrta/Kıdemli Java Geliştirici

Java'da covariant return types (kovaryant dönen türler) mekanizmasının nasıl çalıştığını ve kullanımında hangi hataların yapıldığını anlatın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Covariant return types mekanizması, Java'da bir yöntemi (overriding) geçersiz kılarken, süper sınıftaki türle tam olarak aynı türü döndürmek yerine, onun alt türünü (covariant type) döndürmenize olanak tanır.

Bu, belirli türleri açık yolla dönüştürmeden elde etmeyi sağlayarak kodun ifadesini artırır.

Örnek:

class Animal { } class Dog extends Animal { } class Parent { Animal getAnimal() { return new Animal(); } } class Child extends Parent { @Override Dog getAnimal() { return new Dog(); } // Kovaryant dönüş }

Çalışması için koşullar:

  • Geçersiz kılma yöntemindeki dönen değer türü, orijinal türün alt türü olmalıdır.
  • Kovaryantlık sadece dönen türler için çalışır, parametreler için değil!
  • Sadece referans türler için çalışır, ilkel türler için değil.

Kandırmaca Soru

Alt sınıfta, bir yükleme (overloaded method) yönteminin dönen türünü değiştirmek ve bunu temel türün alt türü yapmak mümkün müdür? Bu geçerli bir yükleme olarak kabul edilecek mi?

Cevap: Hayır, yüklemeler (overloading) için yalnızca parametrelerin imzası önemlidir; dönen türün bir önemi yoktur. Yalnızca dönen türü değiştirmek yüklemede yapılamaz — bu tür bir yöntem imza çakışması yaratır.

Örnek:

class Example { Animal make() { return new Animal(); } // Dog make() { return new Dog(); } // Derleme hatası: tekrarlanan yöntem! }

Kovaryantlık sadece geçersiz kılma (overriding) için çalışır.


Tarih

Bir projede programcı hata yaptı ve aynı isim ve parametrelere sahip, ancak farklı dönen türde bir yüklenmiş yöntem ekledi, bunun "kovaryant geçersiz kılma" olmasını bekleyerek. Sonuç olarak proje derlenmedi ve hata CI sırasında ortaya çıktı.


Tarih

Sınıf hiyerarşisinde kovaryant dönüş kullanırken, geliştirici parametreli türleri (generics) yanlış uyguladı ve alt türleri düzgün bir şekilde gerçekleştirmedi, bu nedenle koleksiyonlarla çalışırken çalıştırma sırasında ClassCastException hatası meydana geldi.


Tarih

Geçersiz kılınan yöntemde daha özel bir tür döndürülüyordu, ancak ekip bu sözleşmeyi belgelememişti. Temel tür üzerinden çalışan kodda tür dönüşümleriyle ilgili zorluklar ve "upcast" referansları sırasında beklenmedik davranışlar ortaya çıktı, bu da bir dizi gizli hataya yol açtı.