Generics Kotlin'de evrensel ve tip güvenli veri yapıları ve fonksiyonlar oluşturmayı sağlar. Temel özellik: Kotlin, generic tip sistemini derleme düzeyinde uyguluyor, tıpkı Java gibi, ancak daha sıkı bir tip kontrolü ve genişletilmiş varyans sözdizimi (kovaryans ve kontravaryans) ile.
Generics kısıtlamaları:
T() yasak).Varyans:
Kovaryans örneği:
interface Producer<out T> { fun produce(): T }
Kontravaryans örneği:
interface Consumer<in T> { fun consume(item: T) }
Java'dan farkı:
? extends, in yerine ? super).?, sadece in/out).Soru: "Kotlin'da bir dizi dizisi (Array<Array<Int>>) Array<out Array<Int>> olarak tanımlanabilir mi ve böyle bir dizide yazma girişiminde ne olur?"
Cevap: Evet, Array<out Array<Int>> olarak tanımlanabilir, ancak böyle bir dizi yalnızca okunabilir (read-only) hale gelir:
val arr: Array<out Array<Int>> = Array(1) { Array(1) { 0 } } arr[0] = arrayOf(1, 2, 3) // Derleme hatası!
Bir değer yazmaya çalışmak hata verecektir — out parametreye sahip generic dizi, elemanların yazılmasına izin vermez, çünkü bu durumda tip güvenliği ihlal edilir.
Hikaye
Takım, out parametre tipinde generic nesneleri içeren bir dizi oluşturmaya çalıştı ve ardından set(index, value) üzerinden değer ekledi. Kod derlendi ama çalışma zamanında hata verdi ve birkaç fonksiyon çalışmaz hale geldi.
Hikaye
Bir defasında, bir kütüphaneyi Java'dan Kotlin'e geçirirken wildcard tipleri (? extends ...), Kotlin'de ise tipleri değişiklik yapmadan out/in olarak kopyaladılar. Sonuç — derleme geçmedi, ve "dolaşma" esnasında hata çalışma zamanında ortaya çıktı ve hata ayıklama sürecini zorlaştırdı.
Hikaye
Kendi sınıfı ile in/out varians kullandılar, ama modifikatörleri karıştırarak
interface Stack<in T>yerineStack<out T>olarak tanımladılar. Bu, yığından eleman döndürmeyi imkânsız hale getirdi: metodun imzası sistem out/in sözleşmesini ihlal etti.