0Pricing
Kotlin Academy · Ders

Tür Silinmesi ve reified Tür Parametreleri

Çalışma zamanında tür bilgilerine erişmek için satır içi işlevlerle reified kullanın.

Tür Silinmesi ve reified Tür Parametreleri, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Tür Silinmesi Nedir

Çalışma zamanında JVM, jenerik tür bağımsız değişkenlerini siler. List<String> ve List<Int> yalnızca List olarak kalır. Bu durum, jenerik türler üzerinde çalışma zamanında gerçekleştirilebilecek işlemleri sınırlar.

fun main() {
    val strings: List<String> = listOf("a", "b")
    val ints: List<Int> = listOf(1, 2)
    println(strings.javaClass == ints.javaClass) // true: both ArrayList
    println(strings is List<*>)  // OK with star
    // println(strings is List<String>) // warning: unchecked cast
}

Sorun: Silinmiş Türler Denetlenemez

Tür bilgisi çalışma zamanında ortadan kalktığı için belirli bir jenerik tür bağımsız değişkeniyle is kullanamazsınız.

fun checkType(obj: Any) {
    // This works:
    if (obj is List<*>) println("It's a list of something")
    // This doesn't compile cleanly:
    // if (obj is List<String>) println("It's a list of strings") // unchecked
}
fun main() {
    checkType(listOf("hello"))
    checkType(42)
}

inline İşlevleri: Özet

inline, derleme zamanında işlev gövdesini çağrı noktasına kopyalar. reified özelliğini mümkün kılan şey budur — tür bağımsız değişkeni de çağrı noktasında yerine konur.

inline fun <T> myRun(block: () -> T): T = block()
fun main() {
    val result = myRun { 42 }
    println(result) // 42
    // The compiler inlines the lambda body — no object allocation
}

Çalışma Zamanında T'ye reified ile Erişme

inline ile reified birlikte kullanıldığında tür bağımsız değişkeni çağrı noktasında korunur; bu da T üzerinde is, as ve ::class kullanılmasını sağlar.

inline fun <reified T> isInstance(value: Any): Boolean = value is T
fun main() {
    println(isInstance<String>("hello"))  // true
    println(isInstance<Int>("hello"))     // false
    println(isInstance<List<*>>(listOf())) // true
}

T'nin KClass'ını Alma

reified T ile çalışma zamanında T::class elde edebilirsiniz — bu, normalde jenerik işlevlerde mümkün değildir.

inline fun <reified T> classNameOf(): String = T::class.simpleName ?: "Unknown"
fun main() {
    println(classNameOf<String>())   // String
    println(classNameOf<Int>())      // Int
    println(classNameOf<List<*>>())  // List
}

reified ile Güvenli Dönüştürme

Fırlatma yapmak yerine null döndüren, tür açısından güvenli bir dönüştürme yardımcısı yazmak için reified kullanın.

inline fun <reified T> Any?.safeCast(): T? = this as? T
fun main() {
    val obj: Any = "Hello"
    val s: String? = obj.safeCast<String>()
    val i: Int? = obj.safeCast<Int>()
    println(s) // Hello
    println(i) // null
}

reified ile JSON Ayrıştırma

Gson veya kotlinx.serialization gibi kitaplıklar, Class nesnelerini açıkça aktarmadan çağrı noktasındaki hedef türü çıkarmak için reified kullanır.

import com.google.gson.Gson
// Simulated without real Gson:
inline fun <reified T> parseJson(json: String): T {
    return Gson().fromJson(json, T::class.java)
}
// Usage:
// val user: User = parseJson<User>("""{"name":"Alice"}""")

reified ile filterIsInstance

Standart kitaplıktaki filterIsInstance<T>(), elle dönüştürme yapmadan bir listeyi belirli bir türe göre filtrelemek için reified kullanır.

fun main() {
    val mixed: List<Any> = listOf(1, "hello", 2.5, "world", true)
    val strings = mixed.filterIsInstance<String>()
    val ints = mixed.filterIsInstance<Int>()
    println(strings) // [hello, world]
    println(ints)    // [1]
}

reified, inline Olmayan İşlevlerde Kullanılamaz

reified yalnızca inline işlevlerle çalışır. inline olmadan kullanmaya çalışmak bir derleme hatasıdır.

// Error:
// fun <reified T> broken(): String = T::class.simpleName ?: "?"

// Must be inline:
inline fun <reified T> correct(): String = T::class.simpleName ?: "?"
fun main() {
    println(correct<Double>()) // Double
}

reified ve Yansıma

Bir türün özelliklerini veya açıklamalarını standart Class parametreleri olmadan dinamik biçimde incelemek için reified ile yansımayı birleştirin.

inline fun <reified T : Any> properties(): List<String> =
    T::class.members.map { it.name }
data class Point(val x: Int, val y: Int)
fun main() {
    println(properties<Point>()) // [x, y, component1, component2, copy, equals, hashCode, toString]
}

Uygulama: Tür Güvenli Hizmet Bulucu

Hafif bir DI çözümü oluşturmak için KClass'ı örneklerle eşleyen bir hizmet bulucu oluşturmak üzere reified kullanın; bunun için açıklama işleyicileri gerekmez.

val registry = mutableMapOf<kotlin.reflect.KClass<*>, Any>()
inline fun <reified T : Any> register(instance: T) { registry[T::class] = instance }
@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> resolve(): T = registry[T::class] as T
class Logger { fun log(msg: String) = println("[LOG] $msg") }
fun main() {
    register(Logger())
    resolve<Logger>().log("Service located!")
}

reified Sınırlamaları

reified tür parametreleri inline olmayan bağlamlarda kullanılamaz, türü daha sonra kullanmak üzere depolayamaz ve çalışma zamanında türe ihtiyaç duyan inline olmayan işlevlere aktarılamaz.

inline fun <reified T> foo() {
    val clazz = T::class // OK here
    // bar(clazz)        // must pass clazz explicitly to non-inline funs
    println(clazz.simpleName)
}
fun bar(clazz: kotlin.reflect.KClass<*>) = println(clazz.simpleName)
fun main() { foo<String>() }

Kısa Kontrol

Bir tür parametresinin reified olması için ne gereklidir?

Özet

Tür silinmesi, jenerik tür bilgilerini çalışma zamanında kaldırır. inline işlevlerdeki reified, tür bağımsız değişkenini çağrı noktasında korur; böylece is, as, ::class ve T üzerinde yansıma kullanılabilir — Class nesnelerini elle aktarmaya gerek kalmaz.

Sıkça Sorulan Sorular

“Tür Silinmesi ve reified Tür Parametreleri” dersi ücretsiz mi?

Evet — “Tür Silinmesi ve reified Tür Parametreleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Tür Silinmesi ve reified Tür Parametreleri” dersinde ne öğreneceğim?

Çalışma zamanında tür bilgilerine erişmek için satır içi işlevlerle reified kullanın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Tür Silinmesi ve reified Tür Parametreleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. where ile Genel İşlevler ve Tür Kısıtlamaları
  2. Bildirim Yerinde Varyans: in ve out
  3. Yıldız Projeksiyonu ve * Ne Zaman Kullanılır
  4. Tür Silinmesi ve reified Tür Parametreleri
← Kotlin Academy Sayfasına Dön