Sobes.tech
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. out ile 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. in ile 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.
  • 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")
        }
    }