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, hattaAB'nin alt tipi olsa bile. Tip tam olarak korunur. - Kovaryant (out): Alt tipleri kullanmaya izin verir.
List<A>,AB'nin alt tipi iseList<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 iseList<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 |