ความแปรผัน ณ จุดใช้งาน
การฉายชนิดข้อมูล
ความแปรผัน ณ จุดใช้งาน เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความแปรผัน ณ จุดใช้งาน
บางครั้งคลาสเจเนอริกโดยรวมไม่แปรผัน แต่ฟังก์ชันเฉพาะอาจสร้างหรือรับชนิดข้อมูลเพียงอย่างเดียว ความแปรผัน ณ จุดใช้งาน หรือการฉายชนิดข้อมูล จะใช้ out หรือ in ตรงตำแหน่งที่ใช้ชนิดข้อมูล
เหตุผลที่ใช้ความแปรผัน ณ จุดใช้งาน
คลาสที่ไม่แปรผันอย่าง MutableList<T> ไม่สามารถทำให้แปรผันร่วมตั้งแต่การประกาศได้ เพราะคลาสนี้อ่านและเขียน T ได้ทั้งคู่ แต่ฟังก์ชันหนึ่งอาจอ่านจากคลาสนี้เพียงอย่างเดียว และการฉายชนิดข้อมูลช่วยให้เราแสดงเจตนานี้ได้อย่างปลอดภัย
การฉายด้วย out
การเขียน Array<out T> เป็นชนิดข้อมูลของพารามิเตอร์จะสร้างมุมมองแบบแปรผันร่วม คุณสามารถอ่านค่า T ได้แต่เขียนค่าไม่ได้ ทำให้ส่ง Array<String> ไปยังตำแหน่งที่ต้องการ Array<out Any> ได้
fun printArray(items: Array<out Any>) {
for (item in items) println(item)
}
fun main() {
val names: Array<String> = arrayOf("Ann", "Bob")
printArray(names)
}อ่านได้เท่านั้น
เมื่อใช้การฉายด้วย out คอมไพเลอร์จะอนุญาตให้อ่านข้อมูล ซึ่งเป็นข้อมูลออก แต่ห้ามเขียนข้อมูล ซึ่งเป็นข้อมูลเข้า เพราะการเขียนอาจทำลายความปลอดภัยด้านชนิดข้อมูลของอาร์เรย์ต้นฉบับ
การฉายด้วย in
การเขียน Array<in T> จะสร้างมุมมองแบบแปรผันย้อน คุณสามารถเขียนค่า T ลงไปได้ แต่ค่าที่อ่านกลับมาจะเป็น Any? ทำให้รับอาร์เรย์ของ T หรือชนิดข้อมูลเหนือกว่าของ T ได้
fun fill(dest: Array<in Int>, value: Int) {
for (i in dest.indices) dest[i] = value
}
fun main() {
val numbers: Array<Number> = arrayOf(0, 0, 0)
fill(numbers, 7)
println(numbers.toList())
}เขียนได้เท่านั้น
เมื่อใช้การฉายด้วย in คุณสามารถเขียนค่าชนิด T ซึ่งเป็นข้อมูลเข้าได้ แต่ชนิดข้อมูลขององค์ประกอบที่อ่านจะถูกมองเป็นชนิดข้อมูลสูงสุด เนื่องจากชนิดข้อมูลจริงขององค์ประกอบอาจเป็นชนิดข้อมูลเหนือกว่าแบบใดก็ได้
การฉายกับความแปรผัน ณ จุดประกาศ
ความแปรผัน ณ จุดประกาศ เช่น class Box<out T> มีผลกับทุกตำแหน่งที่ใช้คลาสนั้น ส่วนการฉาย ณ จุดใช้งาน เช่น Box<out T> ในฐานะพารามิเตอร์ จะมีผลเฉพาะตำแหน่งนั้น ใช้การฉายเมื่อคลาสเองต้องคงเป็นชนิดที่ไม่แปรผัน
การฉายแบบดาว
เมื่อไม่สนใจอาร์กิวเมนต์ชนิดข้อมูลเลย ให้ใช้ การฉายแบบดาว * List<*> หมายถึงรายการของชนิดข้อมูลบางอย่างที่ไม่ทราบแน่ชัด คุณสามารถอ่านสมาชิกโดยใช้ขอบเขตบน และไม่สามารถเขียนได้อย่างปลอดภัย
fun printSize(collection: List<*>) {
println("Size: ${collection.size}")
}
fun main() {
printSize(listOf(1, 2, 3))
printSize(listOf("a", "b"))
}ข้อจำกัดของการฉายแบบดาว
เมื่อใช้ * คุณยังเรียกสมาชิกที่ไม่ขึ้นกับชนิดข้อมูลได้ เช่น size และอ่านสมาชิกเป็น Any? ได้ แต่ไม่สามารถเพิ่มสมาชิกได้ เพราะไม่ทราบชนิดข้อมูลจริง
fun main() {
val unknown: List<*> = listOf("x", "y")
val first: Any? = unknown.first()
println(first)
}การเลือกการฉาย
ใช้ out T เมื่อฟังก์ชันอ่านข้อมูลอย่างเดียว ใช้ in T เมื่อฟังก์ชันเขียนข้อมูลอย่างเดียว และใช้ * เมื่อชนิดข้อมูลที่แน่นอนไม่สำคัญ การฉายเหล่านี้ทำให้คลาสแบบไม่แปรผันใช้งานได้อย่างยืดหยุ่นและปลอดภัยต่อชนิดข้อมูล
ความสัมพันธ์กับไวลด์การ์ดของ Java
การฉาย out T และ in T ของ Kotlin สอดคล้องกับไวลด์การ์ด ? extends T และ ? super T ของ Java หากคุณรู้จักชนิดข้อมูลทั่วไปของ Java อยู่แล้ว การฉายเหล่านี้จะดูคุ้นเคย
ตรวจสอบความเข้าใจ
คุณสามารถทำอะไรได้บ้างกับพารามิเตอร์ที่มีชนิดเป็น Array<out Any>
สรุป
ความแปรผัน ณ จุดใช้งานจะใช้การฉาย out (อ่านอย่างเดียว) หรือ in (เขียนอย่างเดียว) ในจุดใช้งานที่กำหนด และใช้ * เป็นการฉายแบบดาวเมื่อไม่ทราบชนิดข้อมูล วิธีนี้ทำให้คลาสแบบไม่แปรผันยืดหยุ่นได้โดยไม่ต้องเปลี่ยนการประกาศคลาส ถัดไป คุณจะได้จำกัดพารามิเตอร์ชนิดข้อมูลด้วยข้อจำกัดของชนิดข้อมูลทั่วไป
คำถามที่พบบ่อย
บทเรียน “ความแปรผัน ณ จุดใช้งาน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ความแปรผัน ณ จุดใช้งาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ความแปรผัน ณ จุดใช้งาน”
การฉายชนิดข้อมูล คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ความแปรผัน ณ จุดใช้งาน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชันและคลาสแบบเจเนอริก
- ความแปรผัน ณ จุดประกาศ
- ความแปรผัน ณ จุดใช้งาน
- ข้อจำกัดของเจเนอริก