Reified sa Kotlin — ano ito, syntax at aplikasyon

May-akda: IT Sectr Nai-publish: 2026-06-21 Oras ng pagbabasa: 8 min

reified — keyword sa wikang Kotlin na nagbibigay-daan sa pag-access sa uri ng generic parameter sa loob ng inline-function sa oras ng pagpapatupad. Sa ordinaryong generics, gumagana ang type erasure — ang impormasyon tungkol sa uri ay binubura sa yugto ng compilation, ngunit pinapanatili ito ng reified. Ayon sa Kotlin Documentation, 2025, ang reified ay gumagana lamang sa loob ng inline-function, dahil ang compiler ay nagpapalit ng tunay na uri sa yugto ng inlining.

Mga pangunahing punto

  • reified — modifier ng generic parameter na nagpapanatili ng impormasyon tungkol sa uri sa runtime
  • Inline only — ang reified ay gumagana eksklusibo sa loob ng inline-function
  • Type erasure — ang karaniwang mekanismo ng Java/Kotlin na nagbubura ng mga generic na uri; iniiwasan ito ng reified
  • Mga pagsusuri ng is — posible: if (value is T) sa halip na if (value is String)
  • Paglikha ng instance — paggawa ng T::class.java.newInstance() nang hindi nagpapasa ng Class

Ano ang reified sa Kotlin?

reified — ay isang modifier ng generic parameter ng inline-function na nagpapaging tunay sa uri (reify — “gawing tunay”) sa runtime. Kung walang reified, ang uri T sa loob ng generic function ay hindi maa-access — inilalapat ng compiler ang type erasure, binubura ang lahat ng impormasyon tungkol sa uri. reified pinipilit ang compiler na palitan ang konkretong uri sa lugar ng tawag, ginagawa itong accessible sa pamamagitan ng T::class at operator is.

Ayon sa Kotlin Survey by Kodee (2024), ang reified type parameters ay kabilang sa sampung pinaka-hinahanap na feature ng Kotlin — 52% ng mga na-survey na developer ay gumagamit ng mga ito, pangunahin para sa pagsulat ng generic-factory, DI-container, at serializer. Lalo na sikat ang reified kasama ng Gson, Moshi, at Kotlinx Serialization.

Sa teknikal na paraan, simple ang mekanismo: kapag tumatawag ng inline-function na may reified parameter, alam ng compiler ang konkretong uri ng argument (Int, String, User) at pinapalitan ito sa lugar ng T. Sa bytecode, ang reified-parameter ay nagiging ordinaryong Class, na ipinapasa bilang nakatagong argumento.

Gamitin ang reified para sa pagsulat ng generic function kung saan kailangan ang uri sa runtime — paglikha ng instance, pagsusuri ng uri, pagkuha ng Class para sa reflection o serialization.

Problema ng type erasure sa generic

Type erasure — mekanismo ng Java at Kotlin kung saan ang impormasyon tungkol sa generic na parameter ay binubura sa panahon ng compilation. Sa bytecode, ang List at List ay nagiging List na lang. Ito ay ginawa para sa backward compatibility sa Java 1.4, kung saan wala pang generic, ngunit lumilikha ng mga limitasyon kapag nagtatrabaho sa mga uri sa runtime.

kotlin
// ❌ Error: Hindi masusuri ang instance ng binurang uri
fun <T> checkType(value: Any) {
    if (value is T) { // type erasure — hindi alam ang T
        println("Tugma ang uri")
    }
}

// ✅ Solution: pass Class as parameter
fun <T> checkTypeWithClass(
    value: Any,
    clazz: Class<T>
) {
    if (clazz.isInstance(value)) {
        println("Tugma ang uri")
    }
}

Sa halimbawa, ang checkType ay hindi nagko-compile dahil sa type erasure — hindi alam ng compiler kung anong uri ang papalit sa T. Sa checkTypeWithClass, nalutas ang problema sa pamamagitan ng explicit na pagpasa ng Class, ngunit ito ay nangangailangan ng boilerplate: bawat tawag ay sinamahan ng .java o ::class.java. Ganap na inaalis ng reified ang boilerplate na ito.

Syntax ng reified at mekanismo ng trabaho

Ang modifier na reified ay inilalagay bago ang generic parameter sa isang inline-function. Ang function ay dapat na inline — ang compiler ay dapat magkaroon ng kakayahang palitan ang konkretong uri sa yugto ng inlining.

kotlin
inline fun <reified T> isA(value: Any): Boolean {
    return value is T
}

fun main() {
    println(isA<String>("Kumusta")) // true
    println(isA<Int>("Kumusta"))  // false
}

Sa panahon ng compilation, ang tawag na isA("Hello") ay pinapalitan ng pagsusuri na value is String. Ang tawag na isA("Hello") — ng value is Int. Ang uri ay literal na pinapalitan, na nagbibigay-daan sa paggamit ng is, as, ::class, at iba pang operasyon na hindi available sa type erasure.

Decompilation ng reified function

Kung ide-decompile natin ang bytecode ng isA("Hello"), ipapakita ng IntelliJ IDEA ang humigit-kumulang sumusunod na resulta sa Java: String.class.isInstance(value). Sa halip na generic parameter, pinalitan ng compiler ang konkretong java.lang.String.class — walang reflection na may paghahanap ng uri sa pangalan, direktang reference lamang sa klase.

Mga pagsusuri ng uri gamit ang reified: is at as

Ang pinakakaraniwang aplikasyon ng reified — pagsusuri ng uri sa pamamagitan ng operator na is. Sa ordinaryong generic function, ang value is T ay hindi nagko-compile. Sa reified, ito ay gumagana tulad ng sa ordinaryong klase: value is String, value is List (halos — isinasaalang-alang ang mga limitasyon ng reified para sa mga parameterized na uri).

kotlin
inline fun <reified T> List<Any>.filterByType(): List<T> {
    return this.filter { it is T }.map { it as T }
}

val mixed = listOf("a", 1, "b", 2)
val strings = mixed.filterByType<String>() // ["a", "b"]
val ints = mixed.filterByType<Int>()    // [1, 2]

Ang extension function na filterByType ay nagfi-filter ng listahan, nag-iiwan lamang ng mga elemento ng tinukoy na uri. Kung walang reified, kailangan isulat ang filterByType(list) na may parameter na Class. Sa reified, ang tawag ay binabasa bilang natural na operasyon sa listahan, na nagpapabuti sa pagiging nababasa ng mga chain ng pagproseso ng data.

Ayon sa datos Kotlin Coroutines Guide (JetBrains, 2025), ang mga reified type check ay ginagamit sa launch at async para sa pagpasa ng uri ng resulta ng coroutine, na nagpapahintulot na maiwasan ang explicit na pagtukoy ng uri sa karamihan ng mga kaso.

Reflection gamit ang reified: paglikha ng instance at access sa Class

Ang reified ay nagbibigay ng access sa T::class — reference sa KClass, kung saan maaaring makuha ang Java Class sa pamamagitan ng .java. Nagbubukas ito ng mga posibilidad para sa paglikha ng instance sa pamamagitan ng reflection, pagtatrabaho sa mga serializer, at pagkuha ng mga annotation ng klase sa panahon ng pagpapatupad.

kotlin
inline fun <reified T> createInstance(): T =
    T::class.java.getDeclaredConstructor().newInstance()

// Paggamit
data class User(val name: String = "default")
val user = createInstance<User>()

// Serialization gamit ang Gson
inline fun <reified T> Gson.fromJson(json: String): T =
    this.fromJson(json, T::class.java)

// Pagkuha ng mga annotation
inline fun <reified T> hasAnnotation<A>(): Boolean where A : Annotation =
    T::class.java.isAnnotationPresent(A::class.java)

Ang wrapper na fromJson para sa Gson — klasikong halimbawa ng paggamit ng reified sa produksyon. Sa halip na gson.fromJson(json, User::class.java) ay maaaring isulat ang gson.fromJson(json). Ito ay tila isang maliit na pagpapabuti, ngunit sa isang proyekto na may daan-daang tawag ng serialization, ang reified ay makabuluhang nagbabawas ng boilerplate at ginagawang mas malinis ang code.

Mga limitasyon ng reified at mga alternatibo

Ang reified ay may mga limitasyon. Una — gumagana lamang sa loob ng inline-function. Kung ang function ay hindi maaaring gawing inline (halimbawa, recursive o masyadong malaki), hindi available ang reified. Pangalawa — ang reified ay hindi maaaring gamitin nang direkta sa suspend-function, sa pamamagitan lamang ng inline wrapper.

Pangatlo — ang reified ay hindi ganap na gumagana sa mga parameterized na uri. Halimbawa, ang filterByType>() ay maaaring magbigay ng hindi inaasahang resulta, dahil para sa mga parameterized na uri, ang reified ay nagpapanatili lamang ng raw type (List), nang hindi tinutukoy ang mga generic na argumento. Para sa kumpletong pagsusuri ng mga parameterized na uri, kinakailangan ang reflection gamit ang TypeToken.

OperasyonGamit ang reifiedWalang reified
value is T✅ Gumagana❌ Error sa compilation
T::class✅ Gumagana❌ Error sa compilation
List is T⚠️ Raw type lang❌ Error
Paglikha ng instance✅ Sa pamamagitan ng reflection❌ Kailangan ng Class
Suspend function❌ Sa pamamagitan lang ng inline wrapper❌ Hindi applicable

Para sa mga kaso kung saan hindi available ang reified, gamitin ang pattern na may explicit na pagpasa ng Class o TypeToken mula sa mga library (halimbawa, Gson TypeToken o Jackson TypeReference). Ang approach na ito ay gumagana sa anumang function, ngunit nangangailangan ng boilerplate at hindi gaanong maginhawa.

Mga madalas itanong

Bakit ang reified ay gumagana lamang sa inline-function?

Pinapalitan ng compiler ang reified parameter T ng konkretong uri sa panahon ng pag-inline ng body ng function. Kung ang function ay hindi inline, ang compiler ay walang lugar na paglalagyan ng uri — ang tawag ng generic function ay nangyayari sa pamamagitan ng unitary bytecode, kung saan ang T ay binura. Inline ay lumilikha ng hiwalay na kopya ng bytecode para sa bawat uri-argumento.

Maaari bang magdeklara ng reified property?

Hindi, ang reified ay naaangkop lamang sa mga parameter ng function. Para sa properties, gamitin ang pattern na inline fun na may return value o explicit na pagpasa ng Class sa pamamagitan ng constructor. Ang extension properties ay hindi rin sumusuporta sa reified.

Paano gumagana ang reified sa mga nullable na uri?

Sinusuportahan ng reified ang mga nullable na uri: reified T : Any (non-null) at simpleng reified T (maaaring nullable). Para sa mga nullable na uri, ang T::class ay nagbabalik ng klase para sa non-null na bersyon (String::class para sa String?). Ang pagsusuri na value is T ay isinasaalang-alang ang null: kung T = String?, kung gayon ang null is T = true.

May overhead ba ang reified?

Minimal. Ang reified ay hindi gumagamit ng reflection — pinapalitan ng compiler ang konkretong uri sa yugto ng inlining. Sa bytecode, ito ay direktang reference sa klase (ldc + checkcast/invokevirtual). Walang overhead kumpara sa manual na pagpasa ng Class — ang parehong variant ay gumagawa ng parehong bytecode.

Maaari bang gamitin ang reified sa pag-develop ng Android?

Oo, ang reified ay aktibong ginagamit sa Android. Bundle.getParcelable(), Intent.getSerializableExtra(), viewModels() mula sa Android KTX — lahat ng mga function na ito ay gumagamit ng reified upang maiwasan ang explicit na pagpasa ng Class. Ayon sa datos Google Android Docs (2025), ang reified ay inirerekomenda para sa generic API kung saan kailangan ang uri sa runtime.

Buod

  • reified — modifier ng generic parameter ng inline-function, nagpapanatili ng uri sa runtime
  • Type erasure — karaniwang mekanismo ng pagbubura ng uri; iniiwasan ito ng reified sa pamamagitan ng inlining
  • is/as — pagsusuri at conversion ng uri ay gumagana gamit ang reified tulad ng sa ordinaryong klase
  • Reference sa klase — ang T::class at T::class.java ay available para sa reflection at serialization
  • Inline lang — ang reified ay imposible nang walang inline-function dahil sa mekanismo ng pagpapalit ng uri
  • Mga parameterized na uri — ang reified ay hindi nagpapanatili ng generic argumento (raw type lang)
  • Aplikasyon — serialization ng Gson/Moshi, DI-container, pagsusuri ng uri sa collections, Android KTX

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din