Sobes.tech
Junior

Hangi jenerik türlerini biliyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Değersiz, kovaryant ve kontravaryant.

  • Değersizlik: List<A> tipi, List<B> tipiyle alt tip değildir ve tam tersi de geçerlidir, hatta A B'nin alt tipi olsa bile. Tip tam olarak korunur.
  • Kovaryant (out): Alt tipleri kullanmaya izin verir. List<A>, A B'nin alt tipi ise List<B>'nin alt tipidir. Çıkış parametreleri (dönüş değerleri) için kullanılır.
fun foo(list: List<out Number>) {
    // Listeden okuyabiliriz (Number, Double, Int vb.)
    val number: Number = list[0]
    // Listeye ekleme yapamayız (hangi tipte eleman beklendiği bilinmiyor)
    // list.add(1) // Derleme hatası
}
  • Kontravaryant (in): Üst tipleri kullanmaya izin verir. List<B>, A'nın alt tipi ise List<A>'nın alt tipidir. Giriş parametreleri (argümanlar) için kullanılır.
fun foo(comparable: Comparable<in String>) {
    // String veya onun üst tipleri argüman olarak geçilebilir
    val result = comparable.compareTo("hello")
    // String tipi sonuçlar alınamaz (hangi tipte sonuç olduğu bilinmiyor)
    // val str: String = comparable.compareTo("world") // Derleme hatası
}

Kotlin'de bu kavramlar out ve in anotasyonlarıyla parametre tiplerinde uygulanır. Java'da ise wildcards (? extends ve ? super) kullanılır.

Tip Amaç Anahtar Kelime (Kotlin) Wildcard (Java) Okuma izni Yazma izni
Değersiz Tipin tam uyumu Hayır Hayır Evet Evet
Kovaryant Alt tiplerin kullanımı (üretici - "out") out ? extends T Evet Hayır
Kontravaryant Üst tiplerin kullanımı (tüketici - "in") in ? super T Hayır Evet