พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์
ใช้ reified ร่วมกับฟังก์ชัน inline เพื่อตรวจสอบชนิดและแปลงชนิดขณะรันไทม์
พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาการลบข้อมูลชนิด
Kotlin/JVM จะลบข้อมูลชนิดทั่วไปขณะทำงาน ภายในฟังก์ชันทั่วไป fun คุณไม่สามารถเขียน T::class หรือ is T ได้ เนื่องจากหลังการคอมไพล์ JVM ไม่ทราบว่า T คืออะไร
reified ช่วยแก้ปัญหา
ใช้ inline ร่วมกับ reified บนพารามิเตอร์ชนิด เนื่องจากฟังก์ชันถูกแทรกโค้ด คอมไพเลอร์จึงแทนที่ด้วยชนิดจริงในทุกจุดที่เรียกใช้ ทำให้เข้าถึง T ได้อย่างสมบูรณ์ขณะทำงาน
inline fun <reified T> isInstance(value: Any): Boolean = value is T
val result = isInstance<String>("hello") // trueการตรวจสอบชนิดด้วย is T
หากไม่มี reified การใช้ is T จะทำให้เกิดข้อผิดพลาดขณะคอมไพล์ ("ไม่สามารถตรวจสอบอินสแตนซ์ของชนิดที่ถูกลบได้") แต่เมื่อมี reified คอมไพเลอร์จะเขียนการตรวจสอบใหม่โดยใช้ชนิดจริงที่ระบุไว้ ณ จุดเรียกใช้
inline fun <reified T> filterByType(list: List<Any>): List<T> =
list.filterIsInstance<T>()การรับ KClass จาก T
คุณสามารถรับ KClass ของพารามิเตอร์ชนิดข้อมูลได้ด้วย T::class ซึ่งทำให้ตรวจสอบชนิดและส่งการอ้างอิงคลาสให้ API ได้โดยไม่ต้องใช้การสะท้อนกลับ
inline fun <reified T> className(): String = T::class.simpleName ?: "Unknown"
println(className<Int>()) // "Int"การแยกวิเคราะห์ด้วย reified
รูปแบบที่ใช้กันทั่วไปคือการสร้างตัวช่วย parseJson ที่ตรวจสอบชนิดข้อมูลอย่างปลอดภัยและรับคลาสเป้าหมายให้โดยอัตโนมัติ:
inline fun <reified T> parseJson(json: String): T =
jacksonObjectMapper().readValue(json, T::class.java)รูปแบบ ViewModel / Service Locator
คอนเทนเนอร์สำหรับการฉีดการพึ่งพามักใช้ reified เพื่อคืนอินสแตนซ์ที่ถูกต้อง โดยไม่ต้องให้คุณส่งอาร์กิวเมนต์ Class:
inline fun <reified T : ViewModel> Fragment.viewModel(): T =
ViewModelProvider(this)[T::class.java]การเรียกใช้ API ของ Java ด้วย Class<T>
API ของ Java จำนวนมากต้องการอาร์กิวเมนต์ Class โดย reified ช่วยให้คุณเรียกใช้ API เหล่านี้ได้โดยไม่บังคับให้ผู้เรียกส่งคลาสอย่างชัดเจน:
inline fun <reified T> Gson.fromJson(json: String): T =
fromJson(json, T::class.java)reified และข้อจำกัดของชนิดข้อมูล
คุณสามารถใช้ reified ร่วมกับขอบเขตบนได้:
inline fun <reified T : Any> create(): T =
T::class.java.getDeclaredConstructor().newInstance()ข้อจำกัด
พารามิเตอร์ชนิดข้อมูลแบบ reified ใช้ได้เฉพาะในฟังก์ชัน inline เท่านั้น ไม่สามารถใช้ในคลาส อินเทอร์เฟซ หรือฟังก์ชันที่ไม่ใช่ inline ได้ และคุณไม่สามารถเรียกใช้ฟังก์ชัน reified ด้วยชนิดข้อมูลที่ทราบเพียงขณะรันไทม์ได้
คอมไพเลอร์นำไปใช้อย่างไร
ในแต่ละจุดเรียกใช้ คอมไพเลอร์จะแทนที่ T ด้วยอาร์กิวเมนต์ชนิดข้อมูลจริง ไบต์โค้ด ณ จุดเรียกใช้จะมีการอ้างอิงโดยตรงไปยังคลาสจริง จึงไม่ต้องใช้การสะท้อนกลับ
ตัวอย่างจากไลบรารีมาตรฐาน
ฟังก์ชันในไลบรารีมาตรฐานที่ใช้ reified ได้แก่ filterIsInstance, emptyArray, arrayOf และ typeOf ฟังก์ชันเหล่านี้ทำงานได้อย่างแม่นยำเพราะเป็นฟังก์ชันแบบ inline + reified
ตรวจสอบความเข้าใจ
เหตุใด reified จึงกำหนดให้ฟังก์ชันต้องเป็น inline?
สรุป: พารามิเตอร์ชนิดข้อมูลแบบ reified
ประเด็นสำคัญ:
reifiedทำให้เข้าถึงพารามิเตอร์ชนิดข้อมูลได้ขณะรันไทม์ โดยหลีกเลี่ยงการลบชนิดข้อมูล- ฟังก์ชันต้องเป็น
inline - ทำให้ใช้
is T,T::classและT::class.javaภายในฟังก์ชันได้ - ช่วยสนับสนุนการแยกวิเคราะห์ JSON อย่างปลอดภัยตามชนิดข้อมูล ตัวช่วยสำหรับ DI และ API ที่ใช้การอ้างอิงคลาส
คำถามที่พบบ่อย
บทเรียน “พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์”
ใช้ reified ร่วมกับฟังก์ชัน inline เพื่อตรวจสอบชนิดและแปลงชนิดขณะรันไทม์ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชัน inline: ลดต้นทุนของ Lambda
- ตัวปรับแต่ง noinline และ crossinline
- พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์
- รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์