ProgramlamaBackend Geliştirici

Java'da generics (genel türler) ile çalışma ve kullanımın anahtar yönlerini anlatın, güvenli uygulama için bilmeniz gereken ince ayrıntılar nelerdir?

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

Cevap.

Generics, sınıflar, arayüzler ve metodlar için tür parametreleri oluşturmayı sağlar, bu da derleme aşamasında tür kontrolü yapılmasına ve ClassCastException'dan kaçınılmasına yardımcı olur.

Anahtar özellikler ve dikkat edilmesi gereken noktalar:

  • Tür Silinmesi (Type Erasure): Derleme aşamasında tür parametre bilgileri silindiğinden, örneğin, generic türde bir dizi yaratamazsınız: new List<String>[10] — derleme hatası.
  • Kullanım kısıtlamaları:
    • Parametreli türün örneklerini oluşturamazsınız: T obj = new T();
    • Parametreli türlerle instanceof kullanamazsınız: if(obj instanceof List<String>) — hata.
    • Parametreli türler için statik alanlar oluşturamazsınız.
  • Wildcards: ? extends T — kovaryans (okuma), ? super T — kontravaryans (yazma).
  • PECS İlkesi (Producer Extends, Consumer Super): Sadece okumak gerekiyorsa extends, yazmak gerekiyorsa super kullanın.

Örnek:

// Okuma için kovaryant yaklaşım void printNumbers(List<? extends Number> numbers) { for (Number n : numbers) { System.out.println(n); } } // Yazma için kontravariant yaklaşım void addIntegers(List<? super Integer> list) { list.add(10); } }

Kandırmaca soru.

Soru: "List<Object> ve List<?> arasındaki fark nedir? List<?>'ya her türlü nesne eklemek mümkün mü?"

Cevap: Hayır, List<?>'ya (null dışında) hiçbir şey ekleyemezsiniz, çünkü derleyici orada hangi tür parametresi olduğunu bilemez. Ancak List<Object>'a herhangi bir nesne ekleyebilirsiniz.

Örnek:

List<?> list1 = new ArrayList<String>(); // list1.add("test"); // Derleme hatası! List<Object> list2 = new ArrayList<>(); list2.add("test"); // TAMAM

Tema bilgisi eksikliği nedeniyle gerçek hatalara örnekler.


Hikaye

Geliştirici ekibi, T[] parametreli tür bazlı bir önbellek uygulamaya çalıştı. Tür silinmesi ve generic türlerde diziler oluşturma imkansızlığı nedeniyle çözüm beklenildiği gibi çalışmadı: sonucunda Object[] dizisi elde edildi ve bu da runtime'da ClassCastException'a yol açtı.


Hikaye

Bir mikro servis içinde, bir geliştirici List<?>'yı parametre olarak kullanan bir alıcı uygulamaya çalıştı ve koleksiyonu değiştirmeye çalıştı. Bu, derleme hatasına ve PECS doğrultusunda mantığı yeniden şekillendirmesi gerektiği için sürümün gecikmesine yol açtı.


Hikaye

Dış sistem ile entegrasyon projesinde, bir geliştirici, raw-type kullanarak bir türün koleksiyonunu diğer bir tür ile değiştirmekte hata yaptı: List list = new ArrayList<String>(), bu da ClassCastException'a ve üretimde diğer türlere dönüştürme girişiminde hizmetin çökmesine yol açtı.