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

การแปลงชนิดข้อมูลอัจฉริยะ

แปลงชนิดข้อมูลอัตโนมัติหลังการตรวจสอบ

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

สมาร์ตแคสต์คืออะไร

หลังจากตรวจสอบชนิดข้อมูลของค่าแล้ว Kotlin จะจดจำข้อเท็จจริงนั้น ภายในบล็อกที่ตรวจสอบแล้ว ระบบจะถือว่าค่านั้นเป็นชนิดข้อมูลที่แคบลงโดยอัตโนมัติ

ความสามารถนี้เรียกว่าสมาร์ตแคสต์ และช่วยลดการแคสต์ด้วยตนเอง

สมาร์ตแคสต์หลัง is

เมื่อการตรวจสอบด้วย is ผ่านแล้ว คุณสามารถใช้ค่าเสมือนเป็นชนิดข้อมูลนั้นได้โดยไม่ต้องเขียนการแคสต์

คอมไพเลอร์จะเพิ่มการแคสต์ให้คุณเอง

fun describe(x: Any) {
    if (x is String) {
        println(x.length) // x is smart-cast to String
    }
}

fun main() {
    describe("hello")
}

สมาร์ตแคสต์หลังตรวจสอบ null

สมาร์ตแคสต์ใช้กับความเป็น null ได้เช่นกัน หลังยืนยันแล้วว่าค่าไม่ใช่ null ระบบจะถือว่าค่านั้นไม่เป็น null

fun length(text: String?): Int {
    if (text != null) {
        return text.length // smart-cast to non-null String
    }
    return 0
}

fun main() {
    println(length("abc"))
    println(length(null))
}

สมาร์ตแคสต์ใน when

การตรวจสอบชนิดข้อมูลภายใน when ยังเปิดใช้สมาร์ตแคสต์ในแต่ละแขนงได้ด้วย

นี่เป็นวิธีมาตรฐานในการจัดการกับชนิดข้อมูลที่เป็นไปได้หลายแบบ

fun area(shape: Any): Double = when (shape) {
    is Int -> shape.toDouble()
    is String -> shape.length.toDouble()
    else -> 0.0
}

fun main() {
    println(area(5))
    println(area("hello"))
}

สมาร์ตแคสต์กับการคืนค่าก่อนกำหนด

หากคุณคืนค่าทันทีเมื่อค่าเป็น null คอมไพเลอร์จะทราบว่าหลังจากนั้นค่านั้นไม่เป็น null

ส่วนที่เหลือของฟังก์ชันจึงใช้ค่านั้นได้อย่างปลอดภัย

fun process(text: String?) {
    if (text == null) return
    println(text.uppercase()) // smart-cast here
}

fun main() {
    process("data")
    process(null)
}

สมาร์ตแคสต์กับการคืนค่าด้วย Elvis

การใช้ Elvis ร่วมกับ return ยังทำให้เกิดสมาร์ตแคสต์กับโค้ดส่วนที่เหลือด้วย

fun process(text: String?) {
    val safe = text ?: return
    println(safe.length) // safe is non-null
}

fun main() {
    process("hi")
    process(null)
}

เงื่อนไขแบบผสม

สมาร์ตแคสต์จะทำงานตามตรรกะของเงื่อนไขแบบผสมที่ใช้ &&

หลังตรวจสอบชนิดข้อมูลทางด้านซ้ายแล้ว ด้านขวาจะเห็นชนิดข้อมูลที่แคบลงอยู่แล้ว

fun check(x: Any) {
    if (x is String && x.length > 3) {
        println("long string")
    } else {
        println("other")
    }
}

fun main() {
    check("hello")
    check(2)
}

เมื่อสมาร์ตแคสต์ทำงานไม่ได้

สมาร์ตแคสต์ต้องอาศัยการรับประกันว่าค่าจะไม่เปลี่ยนระหว่างการตรวจสอบกับการใช้งาน

var ที่เปลี่ยนแปลงพร้อมกันได้อาจไม่รองรับสมาร์ตแคสต์ ควรใช้ val เพื่อให้สมาร์ตแคสต์ทำงานได้แน่นอน

fun main() {
    val text: String? = "stable"
    if (text != null) {
        println(text.length) // val smart-casts cleanly
    }
}

val ในพื้นที่ปลอดภัยที่สุด

การคัดลอกค่าไปไว้ใน val ที่อยู่ภายในฟังก์ชันทำให้สมาร์ตแคสต์เชื่อถือได้

นี่เป็นรูปแบบที่ใช้กันทั่วไปเมื่อทำงานกับพร็อพเพอร์ตีที่อาจเป็น null

class Box(val content: String?)

fun main() {
    val box = Box("item")
    val c = box.content
    if (c != null) {
        println(c.uppercase())
    }
}

สมาร์ตแคสต์เทียบกับการแคสต์อย่างชัดแจ้ง

สมาร์ตแคสต์ใช้แทนการแคสต์ as อย่างชัดแจ้งได้เกือบทั้งหมด ปลอดภัยกว่าเพราะจะใช้ได้เฉพาะเมื่อพิสูจน์ชนิดข้อมูลนั้นแล้ว

ถัดไป คุณจะได้เรียนรู้ is และ as อย่างชัดแจ้ง

fun main() {
    val x: Any = "text"
    if (x is String) {
        // no need for (x as String)
        println(x.reversed())
    }
}

นำทุกอย่างมาประกอบกัน

สมาร์ตแคสต์ช่วยให้คอมไพเลอร์จำกัดชนิดข้อมูลให้แคบลงโดยอัตโนมัติ:

  • หลังการตรวจสอบด้วย is → แคสต์เป็นชนิดข้อมูลนั้น
  • หลังการตรวจสอบ null → แคสต์เป็นชนิดข้อมูลที่ไม่เป็น null
  • ทำงานใน if when และหลังการคืนค่าก่อนกำหนด
  • เชื่อถือได้มากที่สุดเมื่อใช้กับ val
fun render(x: Any): String {
    if (x is Int) return "number " + x
    if (x is String) return "text " + x.uppercase()
    return "unknown"
}

fun main() {
    println(render(7))
    println(render("go"))
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับสมาร์ตแคสต์

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับสมาร์ตแคสต์:

  • การตรวจสอบชนิดข้อมูลและ null จะจำกัดชนิดข้อมูลให้แคบลงโดยอัตโนมัติ
  • ทำงานใน if when และหลังการคืนค่าก่อนกำหนด
  • val ทำให้สมาร์ตแคสต์เชื่อถือได้มากที่สุด

ถัดไป คุณจะศึกษาโอเปอเรเตอร์ is และ as โดยตรง

คำถามที่พบบ่อย

บทเรียน “การแปลงชนิดข้อมูลอัจฉริยะ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแปลงชนิดข้อมูลอัจฉริยะ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแปลงชนิดข้อมูลอัจฉริยะ”

แปลงชนิดข้อมูลอัตโนมัติหลังการตรวจสอบ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแปลงชนิดข้อมูลอัจฉริยะ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การใช้ when เป็นนิพจน์
  2. การแปลงชนิดข้อมูลอัจฉริยะ
  3. ตัวดำเนินการ is และ as
  4. when แบบครอบคลุมทุกกรณี
← กลับไปที่ Kotlin Academy