Sobes.tech
Middle

Generics'te hangi imkanlar var?

sobes.tech yapay zeka

AI'dan gelen yanıt

Generikler, parametreli sınıflar, arayüzler ve metodlar oluşturmayı sağlar.

Ana özellikler:

  • Kod tekrarını önleme: Herhangi bir türle çalışan evrensel veri yapıları ve algoritmalar oluşturma.
  • Derleme zamanında tip güvenliği: Tip hataları derleme aşamasında tespit edilir, çalışma zamanında değil. Manuel tip dönüşümlerine ve olası ClassCastException hatalarına gerek kalmaz.
  • Daha iyi okunabilirlik: Kod, hangi türlerle çalıştığını açıkça gösterdiği için daha anlaşılır hale gelir.

Örnekler:

  • List<T> kapsayıcı sınıfı, herhangi bir tür T öğesini depolayabilir.
  • static <T> T getFirst(List<T> list) metodu, herhangi bir türdeki listenin ilk öğesini dönebilir.

Generics kısıtlamaları:

  • Parametreli türlerin örnekleri oluşturulamaz: new T().
  • İlkel türler parametre olarak kullanılamaz (örneğin, List<int> - yanlış, List<Integer> kullanılmalı).
  • Generik türlerde diziler doğrudan oluşturulamaz (örneğin, T[] array = new T[10] - yanlış, ArrayList kullanılmalı veya tip dönüşümü yapılmalı).
  • Statik alanlar doğrudan kullanılamaz.
  • Tip bilgisi çalışma zamanında silinir (Type Erasure), sınırlandırılmış wildcards hariç.

Wildcards ve sınırlandırılmış Tip Parametreleri:

  • <?>: Bilinmeyen tür. Öğeleri okumaya izin verir, yazmaya izin vermez.
  • <? extends T>: Üst sınır. T'nin alt türleriyle çalışmaya izin verir. T veya onun üst türlerindeki öğeleri okuyabilir, yazamaz (null hariç).
  • <? super T>: Alt sınır. T veya onun alt türleriyle çalışmaya izin verir. T veya onun alt türlerindeki öğeleri yazabilir, okuma sırasında sadece Object alınır.

Örnek:

// Number alt türlerini içeren herhangi bir listenin öğelerini yazdırabilen metod
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Derleme hatası
}

// Integer ekleyebilen metod
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Derleme hatası, Object döner
}