0Pricing
Kotlin Academy · บทเรียน

พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์

ใช้ reified ร่วมกับฟังก์ชัน inline เพื่อตรวจสอบชนิดและแปลงชนิดขณะรันไทม์

พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาการลบข้อมูลชนิด

Kotlin/JVM จะลบข้อมูลชนิดทั่วไปขณะทำงาน ภายในฟังก์ชันทั่วไป fun foo() คุณไม่สามารถเขียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชัน inline: ลดต้นทุนของ Lambda
  2. ตัวปรับแต่ง noinline และ crossinline
  3. พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์
  4. รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์
← กลับไปที่ Kotlin Academy