Middle
Kotlin'de jenerik tiplerle nasıl çalışılır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Kotlin'deki jenerik türler, farklı türlerdeki verilerle çalışan sınıflar, arayüzler ve fonksiyonlar oluşturmaya olanak tanır ve derleme zamanında tür güvenliğini korur.
Temel kavramlar ve çalışma yöntemleri:
- Jenerik sınıf ve arayüzlerin tanımlanması:
class Box<T>(val item: T) // T parametreli jenerik sınıf interface MyList<E> { // E parametreli jenerik arayüz fun add(element: E) fun get(index: Int): E } - Jenerik fonksiyonların tanımlanması:
fun <T> printAnything(value: T) { // T parametreli jenerik fonksiyon println(value) } - Jenerik tür örneklerinin oluşturulması:
val intBox: Box<Int> = Box(123) // Belirli bir tür (Int) belirtiliyor val stringBox = Box("hello") // Derleyici türü çıkarıyor (String) - Varyantlar: Jenerik türlerle alt türlerin nasıl çalıştığını tanımlamaya olanak tanır.
- Kovaryans (out): Tür ve alt türlerini kullanmaya izin verir.
outile belirtilir. Örnek:List<out Any>List<String>içerebilir. Değer üreten türler için kullanılır (örneğin, koleksiyonlardan okuma).interface Producer<out T> { // out T - kovaryant parametre fun produce(): T } - Kontravaryans (in): Tür ve üst türlerini kullanmaya izin verir.
inile belirtilir. Örnek:Comparator<in String>Comparator<Any>ile çalışabilir. Değer tüketen türler için kullanılır (örneğin, koleksiyona yazma).interface Consumer<in T> { // in T - kontravaryant parametre fun consume(value: T) } - Invariyans: Jenerik parametredeki tür tam olarak aynıdır. Varsayılan davranıştır.
- Kovaryans (out): Tür ve alt türlerini kullanmaya izin verir.
- Tür kısıtlamaları (
where): Parametre türünü belirli arayüzleri uygulayacak veya belirli bir sınıftan türetilecek şekilde sınırlar.fun <T : Comparable<T>> max(a: T, b: T): T { // T, Comparable implement etmeli return if (a > b) a else b } fun <T> process(item: T) where T : Runnable, T : Comparable<T> { item.run() // ... karşılaştırılabilirlik kullanımı } - Yıldız (star) projeksiyonu (
*): Tür argümanlarının önemli olmadığı durumlarda kullanılır. Java'daki<?>ile aynıdır.fun printList(list: List<*>) { // Herhangi bir türde liste kabul edebilir for (item in list) { println(item) } }
Kotlin'deki jenerik türler, Java'daki gibi tür silme (type erasure) kullanır. Belirli tür bilgisi çalışma zamanında kaybolur. Çalışma zamanında türlerle çalışmak için reified türler kullanılır.
- Reified türler (
reified): Sadece inline fonksiyonlar için kullanılabilir. Parametrenin tür bilgisini çalışma zamanında korumaya olanak tanır.inline fun <reified T> checkType(value: Any) { // T, reified tür if (value is T) { println("Değer T türündedir") } else { println("Değer T türünde değildir") } }