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 — 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
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
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
// ❌ 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
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.
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
Kung ide-decompile natin ang bytecode ng isA
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
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
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.
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.
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
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.
| Operasyon | Gamit ang reified | Walang reified |
|---|---|---|
| value is T | ✅ Gumagana | ❌ Error sa compilation |
| T::class | ✅ Gumagana | ❌ Error sa compilation |
| List | ⚠️ 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
Mga madalas itanong
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.
Hindi, ang reified ay naaangkop lamang sa mga parameter ng function. Para sa properties, gamitin ang pattern na inline fun
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.
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
Oo, ang reified ay aktibong ginagamit sa Android. Bundle.getParcelable
Buod
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.
Basahin din