เครื่องหมายอัศเจรีย์เดี่ยวใน Kotlin หมายถึงอะไร? ฉันเคยเห็นมาสองสามครั้งแล้วโดยเฉพาะเมื่อใช้ Java API แต่ฉันไม่พบในเอกสารหรือใน StackOverflow
เครื่องหมายอัศเจรีย์เดี่ยวใน Kotlin หมายถึงอะไร? ฉันเคยเห็นมาสองสามครั้งแล้วโดยเฉพาะเมื่อใช้ Java API แต่ฉันไม่พบในเอกสารหรือใน StackOverflow
คำตอบ:
พวกเขาเรียกว่าประเภทแพลตฟอร์มและหมายความว่า Kotlin ไม่รู้ว่าค่านั้นสามารถหรือไม่ได้null
และขึ้นอยู่กับคุณที่จะตัดสินใจว่าเป็นโมฆะหรือไม่
สรุปได้ว่าปัญหาคือการอ้างอิงใด ๆ ที่มาจาก Java อาจเป็นโมฆะและ Kotlin ถูกออกแบบให้มีความปลอดภัยเป็นโมฆะบังคับให้ผู้ใช้ตรวจสอบค่า Java ทุกค่าเป็นโมฆะหรือใช้การเรียกที่ปลอดภัย (
?.
) หรือการยืนยันที่ไม่ใช่ค่าว่าง (!!
). คุณลักษณะเหล่านี้มีประโยชน์มากในโลก Kotlin ที่บริสุทธิ์มีแนวโน้มที่จะกลายเป็นหายนะเมื่อคุณต้องใช้บ่อยเกินไปในการตั้งค่า Kotlin / Javaนี่คือเหตุผลที่เราใช้แนวทางที่รุนแรงและทำให้ระบบประเภทของ Kotlin ผ่อนคลายมากขึ้นเมื่อพูดถึงการทำงานร่วมกันของ Java: ตอนนี้การอ้างอิงที่มาจาก Java ได้ทำเครื่องหมายประเภทไว้เป็นพิเศษ - Kotlin Blog
เป็นสัญกรณ์สำหรับประเภทแพลตฟอร์ม :
T!
หมายถึง " T
หรือT?
"
T
หมายความว่า " T!
หรือT?
"
T
ถูกทำให้ "ไม่เป็นโมฆะ" และส่วนที่เหลือนั้นมากหรือน้อยโดยพลการ
ชื่อประเภทหรือชื่อคลาสที่ลงท้ายด้วยเครื่องหมายอัศเจรีย์เดี่ยว!
เรียกว่าประเภทแพลตฟอร์มใน Kotlin คุณจะพบเมื่อคุณทำงานใน Kotlin ด้วยโค้ด Java เก่าที่ไม่มีข้อมูล nullability
ตัวอย่าง:
ข้อมูล Nullable: Nullable Type
@Nullable String
ใน Java ถือเป็นString?
โดย Kotlin
ข้อมูลที่ไม่เป็นค่าว่าง: ประเภทที่ไม่เป็นค่าว่าง
@NotNull String
ใน Java ถือเป็นString
โดย Kotlin
ไม่มีข้อมูล: ประเภทแพลตฟอร์ม
String
ไม่มีคำอธิบายประกอบใน Java ถือว่าString!
Kotlin
คุณสามารถทำงานกับแพลตฟอร์มประเภทที่เป็นค่าว่างหรือไม่เป็นค่าว่างก็ได้ คอมไพเลอร์จะอนุญาตให้คุณเรียกใช้เมธอดทั้งหมดในประเภทนี้ เป็นความรับผิดชอบของคุณในการใช้งาน หากคุณรู้ว่าค่าสามารถเป็นโมฆะได้คุณควรเปรียบเทียบกับค่าว่างก่อนที่จะเรียกใช้วิธี ถ้าคุณรู้ว่ามันไม่ใช่โมฆะคุณสามารถใช้มันได้โดยตรง แต่เช่นเดียวกับใน Java คุณจะได้รับข้อยกเว้นหากสมมติฐานของคุณเกี่ยวกับความว่างเปล่านั้นผิด
โปรดทราบว่าคุณไม่สามารถประกาศประเภทแพลตฟอร์มในโค้ด Kotlin ได้เนื่องจากมาจากโค้ด Java เท่านั้น
ในขณะที่แทนที่เมธอด Java ในโค้ด Kotlin คุณมีตัวเลือกในการประกาศพารามิเตอร์และส่งคืนชนิดเป็นโมฆะหรือไม่เป็นค่าว่าง คุณต้องเลือกสิ่งนี้อย่างชาญฉลาดเพราะถ้าคุณตัดสินใจที่จะทำให้พารามิเตอร์ไม่ใช่ค่าว่างคอมไพเลอร์ Kotlin จะสร้างการยืนยันที่ไม่ใช่ค่าว่างสำหรับพารามิเตอร์ที่ไม่ใช่ค่าว่างเหล่านี้ และเมื่อครั้งต่อไปที่คุณเข้าถึงรหัส Kotlin นี้กลับจาก Java และคุณส่งค่า null คุณจะได้รับข้อยกเว้น
หวังว่าจะช่วยคลายข้อสงสัยทั้งหมดของคุณเกี่ยวกับประเภทแพลตฟอร์ม
ประเภทของสัญญลักษณ์!
ที่เรียกว่าประเภทแพลตฟอร์มซึ่งเป็นชนิดที่มาจาก Javanull
และทำให้ส่วนใหญ่อาจจะสามารถ นี่คือสิ่งที่คอมไพเลอร์ Kotlin อนุมานโดยค่าเริ่มต้นเมื่อเรียกใช้ Java (สำหรับกรณีพื้นฐานที่สุดวิธี Java สามารถใส่คำอธิบายประกอบเพื่อหลีกเลี่ยงสิ่งนี้ได้) คุณควรจัดการประเภทแพลตฟอร์มnullableประเภทเว้นแต่คุณจะรู้อย่างแน่นอนว่าเฉพาะ API null
จะไม่กลับ คอมไพเลอร์อนุญาตให้กำหนดประเภทแพลตฟอร์มให้กับตัวแปรทั้งประเภทที่เป็นโมฆะและไม่เป็นค่าว่าง
[... ]
T!
แปลว่า "T or T?
" [... ]
คุณสามารถอ้างถึงประเภทแพลตฟอร์มเป็น "ประเภทของค่าว่างที่ไม่รู้จัก " สิ่งสำคัญที่ควรทราบคือคุณไม่สามารถใช้เครื่องหมายอัศเจรีย์สำหรับประเภทของคุณเองได้ไม่ใช่ส่วนหนึ่งของไวยากรณ์ Kotlin แต่เป็นเพียงสัญกรณ์เท่านั้น
ฉันเคยเห็นมาสองสามครั้งแล้วโดยเฉพาะเมื่อใช้ Java API
ดังกล่าวโดย s1m0nw1, วิธีการT!
T or T?
คำถามต่อไปคืออะไรT?
? นี้เป็นเอกสารอย่างที่https://kotlinlang.org/docs/reference/null-safety.html Kotlin ไม่อนุญาตให้มีองค์ประกอบบางอย่างnull
เช่นString
ไม่เหมือน Java
เพื่อให้ nulls เราสามารถประกาศตัวแปรเป็นสตริง nullable เขียน String?:
var b: String? = "abc" b = null // ok
[... ]
b?.length
สิ่งนี้จะส่งกลับ b.length ถ้า b ไม่ใช่ null มิฉะนั้นจะเป็นค่าว่าง
Int?
ประเภทของการแสดงออกนี้อยู่
ตัดตอนมาจากประเภทแพลตฟอร์มใน Kotlin :
นอกเหนือจากการระบุประเภทอย่างชัดเจนว่าเป็นทางเลือก (เช่น
Person?
) Kotlin ยังนำเสนอสัตว์ร้ายอีกตัวหนึ่งที่เรียกว่าPlatform Type
ระบุโดยการใส่เครื่องหมายอัศเจรีย์ตัวเดียวแทน (เช่นPerson!
) แนวคิดนี้ถูกสร้างขึ้นเพื่อเหตุผลด้านความเข้ากันได้เมื่อเข้าถึงโค้ดจากแพลตฟอร์มที่ไม่ปลอดภัยเช่น Java มักเป็นกรณีที่เมื่อใช้ไลบรารี Java วิธีการต่างๆจะส่งคืนSomeType!
เนื่องจากคอมไพเลอร์ Kotlin ไม่สามารถสรุปได้ว่าผลลัพธ์เป็นโมฆะหรือไม่
ตัวอย่างเช่น:
(Mutable)Collection<T>!
เพียงแค่หมายถึงสิ่งต่อไปนี้: " คอลเลกชัน Java ของ T อาจเปลี่ยนแปลงได้หรือไม่อาจเป็นโมฆะหรือไม่ก็ได้ "
หวังว่านี่จะช่วยได้
platform types