ProgramlamaBackend geliştirme

Kotlin'da generic'ler nasıl uygulanır? Hangi kısıtlamalar vardır, invariance, covariance ve contravariance nasıl çalışır ve bunlar Java'daki generics'den nasıl farklıdır? Kullanım örnekleri verin.

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

Cevap

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ı:

  • Tip parametreleri varsayılan olarak invariandır.
  • Tip parametresinin bir örneğini oluşturmak mümkün değildir (T() yasak).
  • Çalışma zamanında generic tipler hakkında bilgiye erişim yoktur (tip silinmesi).

Varyans:

  • Kovaryans (out T): alt tiplerin kullanılmasına izin verir.
  • Kontravaryans (in T): süper tiplerin kullanılmasına izin verir.
  • İnvariyans: varyans modifikatörü olmayan tip.

Kovaryans örneği:

interface Producer<out T> { fun produce(): T }

Kontravaryans örneği:

interface Consumer<in T> { fun consume(item: T) }

Java'dan farkı:

  • Sözdizim daha açık ve öz (out yerine ? extends, in yerine ? super).
  • Wildcard tipler yok (?, sadece in/out).
  • Generic parametrelerin örneğini oluşturma yasağı.

Kandırmaca soru

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.

Bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


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> yerine Stack<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.