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:
new List<String>[10] — derleme hatası.T obj = new T();if(obj instanceof List<String>) — hata.? extends T — kovaryans (okuma), ? super T — kontravaryans (yazma).Ö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); } }
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
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ı: sonucundaObject[]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ı.