Kotlin Academy · Pelajaran

Penghapusan Jenis dan Parameter Jenis reified

Gunakan reified dengan fungsi inline untuk mengakses maklumat jenis semasa masa jalan.

Pelajaran 4 daripada 414 langkah

Penghapusan Jenis dan Parameter Jenis reified ialah pelajaran Kotlin Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kotlin Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.

Apakah Pemadaman Jenis?

Pada masa jalan, JVM memadamkan argumen jenis generik. List<String> dan List<Int> kedua-duanya hanya menjadi List. Ini mengehadkan operasi jenis masa jalan pada generik.

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
}

Masalahnya: Tidak Boleh Menyemak Jenis yang Dipadamkan

Anda tidak boleh menggunakan is dengan argumen jenis generik tertentu kerana maklumat jenis itu telah hilang semasa masa jalan.

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)
}

Rumusan Fungsi inline

inline menyalin badan fungsi ke tapak panggilan semasa penyusunan. Inilah yang membolehkan reified — argumen jenis turut digantikan pada tapak panggilan.

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
}

reified: Mengakses T semasa Masa Jalan

Menggabungkan inline dengan reified mengekalkan argumen jenis pada tapak panggilan, lalu membolehkan is, as dan ::class digunakan pada T.

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
}

Mendapatkan KClass bagi T

Dengan reified T, anda boleh mendapatkan T::class semasa masa jalan — sesuatu yang biasanya mustahil dalam fungsi generik.

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

Tuangan Selamat dengan reified

Gunakan reified untuk menulis utiliti tuangan yang selamat dari segi jenis dan memulangkan nol, bukannya menghasilkan pengecualian.

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
}

Penghuraian JSON dengan reified

Pustaka seperti Gson atau kotlinx.serialization menggunakan reified untuk membuat kesimpulan jenis sasaran pada tapak panggilan tanpa menghantar objek Class secara jelas.

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 dengan filterIsInstance

Pustaka standard filterIsInstance<T>() menggunakan reified untuk menapis senarai kepada jenis tertentu tanpa tuangan manual.

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]
}

Tidak Boleh Menggunakan reified dalam Fungsi Bukan inline

reified hanya berfungsi dengan fungsi inline. Percubaan menggunakannya tanpa inline menghasilkan ralat penyusunan.

// 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 dan Refleksi

Gabungkan reified dengan refleksi untuk memeriksa sifat atau anotasi sesuatu jenis secara dinamik tanpa parameter Class yang berulang.

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]
}

Praktikal: Pencari Lokasi Perkhidmatan Selamat Jenis

Gunakan reified untuk membina pencari lokasi perkhidmatan yang memetakan KClass kepada tika bagi DI ringan tanpa pemproses anotasi.

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!")
}

Batasan reified

Parameter jenis reified tidak boleh digunakan dalam konteks bukan inline, tidak boleh menyimpan jenis untuk kegunaan kemudian dan tidak boleh dihantar kepada fungsi bukan inline yang memerlukan jenis itu semasa masa jalan.

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>() }

Semakan Pantas

Apakah yang diperlukan supaya parameter jenis menjadi reified?

Rumusan

Pemadaman jenis membuang maklumat jenis generik semasa masa jalan. reified pada fungsi inline mengekalkan argumen jenis pada tapak panggilan, lalu membolehkan is, as, ::class dan refleksi pada T — tanpa menghantar objek Class secara manual.

Percuma untuk bermula

Pelajari Kotlin dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Penghapusan Jenis dan Parameter Jenis reified” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kotlin Academy, termasuk “Penghapusan Jenis dan Parameter Jenis reified”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penghapusan Jenis dan Parameter Jenis reified”?

Gunakan reified dengan fungsi inline untuk mengakses maklumat jenis semasa masa jalan. Anda berlatih Kotlin Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Kotlin Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Kotlin Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Penghapusan Jenis dan Parameter Jenis reified” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Fungsi Generik dan Kekangan Jenis dengan where
  2. Varians pada Tapak Pengisytiharan: in dan out
  3. Unjuran Bintang dan Bila Hendak Menggunakan *
  4. Penghapusan Jenis dan Parameter Jenis reified
← Kembali ke Kotlin Academy