reified — Kotlin زبان میں ایک کلیدی لفظ ہے جو inline-فنکشن کے اندر generic-پیرامیٹر کی قسم تک runtime میں رسائی کی اجازت دیتا ہے۔ عام generics میں type erasure کام کرتا ہے — قسم کی معلومات کمپائلیشن کے مرحلے پر مٹ جاتی ہیں، لیکن reified اسے محفوظ رکھتا ہے۔ Kotlin Documentation, 2025 کے مطابق، reified صرف inline-فنکشنز کے اندر کام کرتا ہے، کیونکہ کمپائلر اصلی قسم کو inlining کے مرحلے پر داخل کرتا ہے۔
اہم نکات
reified — inline-فنکشن کے generic-پیرامیٹر کا ایک موڈیفائر ہے جو runtime میں قسم کو حقیقی (reify — «حقیقی بنانا») بناتا ہے۔ reified کے بغیر generic-فنکشن کے اندر T کی قسم قابل رسائی نہیں ہے — کمپائلر type erasure کا اطلاق کرتا ہے، قسم کے بارے میں تمام معلومات مٹا دیتا ہے۔ reified کمپائلر کو مجبور کرتا ہے کہ وہ کال کی جگہ پر مخصوص قسم داخل کرے، اسے T::class اور is آپریٹر کے ذریعے قابل رسائی بنائے۔
Kotlin Survey by Kodee (2024) کے مطابق، reified type parameters Kotlin کی دس سب سے زیادہ مطلوبہ خصوصیات میں شامل ہیں — انہیں 52% جواب دہندگان استعمال کرتے ہیں، خاص طور پر generic-فیکٹریز، DI-کنٹینرز اور سیریلائزرز لکھنے کے لیے۔ reified خاص طور پر Gson، Moshi اور Kotlinx Serialization کے ساتھ مقبول ہے۔
تکنیکی طور پر طریقہ کار آسان ہے: reified پیرامیٹر کے ساتھ inline-فنکشن کو کال کرتے وقت، کمپائلر آرگیومنٹ کی مخصوص قسم (Int, String, User) جانتا ہے اور اسے T کی جگہ داخل کرتا ہے۔ بائٹ کوڈ میں reified-پیرامیٹر ایک عام Class
reified کو generic-فنکشنز لکھنے کے لیے استعمال کریں جہاں runtime میں قسم کی ضرورت ہو — مثالیں بنانا، قسم کی جانچ، ریفلیکشن یا سیریلائزیشن کے لیے Class
Type erasure — Java اور Kotlin کا وہ طریقہ کار ہے جس میں generic-پیرامیٹرز کی معلومات کمپائلیشن کے دوران مٹ جاتی ہیں۔ بائٹ کوڈ میں List
// ❌ خرابی: مٹائی گئی قسم کی مثال کی جانچ نہیں کر سکتے
fun <T> checkType(value: Any) {
if (value is T) { // type erasure — T نامعلوم ہے
println("قسم مماثل ہے")
}
}
// ✅ Solution: pass Class as parameter
fun <T> checkTypeWithClass(
value: Any,
clazz: Class<T>
) {
if (clazz.isInstance(value)) {
println("قسم مماثل ہے")
}
}
مثال میں checkType type erasure کی وجہ سے کمپائل نہیں ہوتا — کمپائلر نہیں جانتا کہ T کی جگہ کون سی قسم ڈالنی ہے۔ checkTypeWithClass میں مسئلہ Class
reified موڈیفائر inline-فنکشن میں generic-پیرامیٹر سے پہلے لگایا جاتا ہے۔ فنکشن لازماً inline ہونا چاہیے — کمپائلر کے پاس inlining کے مرحلے پر مخصوص قسم داخل کرنے کی صلاحیت ہونی چاہیے۔
inline fun <reified T> isA(value: Any): Boolean {
return value is T
}
fun main() {
println(isA<String>("ہیلو")) // true
println(isA<Int>("ہیلو")) // false
}
کمپائلیشن کے دوران isA
اگر isA
reified کا سب سے عام استعمال is آپریٹر کے ذریعے قسم کی جانچ ہے۔ عام generic-فنکشن میں value is T کمپائل نہیں ہوتا۔ reified کے ساتھ یہ عام کلاس کی طرح کام کرتا ہے: 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]
Extension function filterByType صرف مخصوص قسم کے عناصر کو رکھتے ہوئے فہرست کو فلٹر کرتا ہے۔ reified کے بغیر filterByType
Kotlin Coroutines Guide (JetBrains, 2025) کے مطابق، reified type checks launch اور async میں کوروٹین کے نتیجے کی قسم منتقل کرنے کے لیے استعمال ہوتے ہیں، جو زیادہ تر معاملات میں قسم کو واضح طور پر بتانے کی ضرورت سے بچاتا ہے۔
reified T::class تک رسائی دیتا ہے — KClass کا حوالہ، جس سے .java کے ذریعے Java Class حاصل کیا جا سکتا ہے۔ یہ ریفلیکشن کے ذریعے مثالیں بنانے، سیریلائزرز کے ساتھ کام کرنے اور runtime میں کلاس کی تشریحات حاصل کرنے کے امکانات کھولتا ہے۔
inline fun <reified T> createInstance(): T =
T::class.java.getDeclaredConstructor().newInstance()
// استعمال
data class User(val name: String = "default")
val user = createInstance<User>()
// Gson کے ساتھ سیریلائزیشن
inline fun <reified T> Gson.fromJson(json: String): T =
this.fromJson(json, T::class.java)
// تشریحات حاصل کرنا
inline fun <reified T> hasAnnotation<A>(): Boolean where A : Annotation =
T::class.java.isAnnotationPresent(A::class.java)
Gson کے لیے fromJson ریپر — production میں reified استعمال کرنے کی کلاسک مثال۔ gson.fromJson(json, User::class.java) کی بجائے gson.fromJson
reified کی حدود ہیں۔ پہلی — یہ صرف inline-فنکشنز کے اندر کام کرتا ہے۔ اگر فنکشن کو inline نہیں بنایا جا سکتا (مثلاً یہ recursive ہے یا بہت بڑی ہے)، تو reified دستیاب نہیں ہے۔ دوسری — reified کو suspend-فنکشنز کے ساتھ براہ راست استعمال نہیں کیا جا سکتا، صرف inline-ریپرز کے ذریعے۔
تیسری — reified parameterized اقسام کے ساتھ مکمل طور پر کام نہیں کرتا۔ مثال کے طور پر، filterByType>() غیر متوقع نتیجہ دے سکتا ہے، کیونکہ parameterized اقسام کے لیے reified صرف خام قسم (List) کو محفوظ رکھتا ہے، generic-آرگیومنٹس کے بغیر۔ parameterized اقسام کی مکمل جانچ کے لیے TypeToken کے ساتھ ریفلیکشن درکار ہے۔
| عمل | reified کے ساتھ | reified کے بغیر |
|---|---|---|
| value is T | ✅ کام کرتا ہے | ❌ کمپائلیشن کی خرابی |
| T::class | ✅ کام کرتا ہے | ❌ کمپائلیشن کی خرابی |
| List | ⚠️ صرف raw type | ❌ خرابی |
| مثال بنانا | ✅ ریفلیکشن کے ذریعے | ❌ Class |
| Suspend-فنکشن | ❌ صرف inline ریپر کے ذریعے | ❌ قابل اطلاق نہیں |
جب reified دستیاب نہ ہو، تو لائبریریوں سے Class
اکثر پوچھے گئے سوالات
کمپائلر reified-پیرامیٹر T کو فنکشن کے باڈی کو inlining کرتے وقت مخصوص قسم سے بدل دیتا ہے۔ اگر فنکشن inline نہیں ہے، تو کمپائلر کے پاس قسم ڈالنے کی جگہ نہیں ہوتی — generic-فنکشن کی کال ایک یونیفائیڈ بائٹ کوڈ کے ذریعے ہوتی ہے جہاں T مٹا دیا جاتا ہے۔ Inline ہر قسم-آرگیومنٹ کے لیے بائٹ کوڈ کی علیحدہ کاپی بناتا ہے۔
نہیں، reified صرف فنکشن کے پیرامیٹرز پر لاگو ہوتا ہے۔ پراپرٹیز کے لیے inline fun
reified nullable-اقسام کو سپورٹ کرتا ہے: reified T : Any (non-null) اور صرف reified T (nullable ہو سکتا ہے)۔ nullable-اقسام کے لیے T::class non-null ورژن کے لیے کلاس لوٹاتا ہے (String? کے لیے String::class)۔ value is T کی جانچ null کو مدنظر رکھتی ہے: اگر T = String? ہے تو null is T = true۔
کم سے کم۔ reified ریفلیکشن استعمال نہیں کرتا — کمپائلر inlining کے مرحلے پر مخصوص قسم داخل کرتا ہے۔ بائٹ کوڈ میں یہ کلاس کا براہ راست حوالہ ہوتا ہے (ldc + checkcast/invokevirtual)۔ Class
ہاں، reified Android میں بڑے پیمانے پر استعمال ہوتا ہے۔ Bundle.getParcelable
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں