ผมไม่แน่ใจว่าผมเข้าใจความแตกต่างระหว่างและSomeGeneric<*>
SomeGeneric<Any>
ฉันคิดว่า*
แสดงถึงอะไรก็ได้ (สัญลักษณ์แทน) และAny
แสดงถึงวัตถุที่วัตถุทั้งหมดสืบทอดมา ดูเหมือนว่าพวกเขาควรจะเหมือนกัน แต่พวกเขา?
ผมไม่แน่ใจว่าผมเข้าใจความแตกต่างระหว่างและSomeGeneric<*>
SomeGeneric<Any>
ฉันคิดว่า*
แสดงถึงอะไรก็ได้ (สัญลักษณ์แทน) และAny
แสดงถึงวัตถุที่วัตถุทั้งหมดสืบทอดมา ดูเหมือนว่าพวกเขาควรจะเหมือนกัน แต่พวกเขา?
คำตอบ:
อาจเป็นประโยชน์หากคิดว่าการฉายภาพของดวงดาวเป็นวิธีการแสดงไม่ใช่แค่ประเภทใดประเภทหนึ่ง แต่เป็นประเภทตายตัวบางประเภทซึ่งคุณไม่รู้ว่าคืออะไรกันแน่
ตัวอย่างเช่นประเภทMutableList<*>
แสดงรายการของบางสิ่งบางอย่าง (คุณไม่รู้ว่าคืออะไร) ดังนั้นหากคุณพยายามเพิ่มบางอย่างในรายการนี้คุณจะไม่ประสบความสำเร็จ อาจเป็นรายการString
s หรือรายการInt
s หรือรายการอื่น ๆ คอมไพเลอร์ไม่อนุญาตให้ใส่วัตถุใด ๆ ในรายการนี้เลยเนื่องจากไม่สามารถตรวจสอบได้ว่ารายการยอมรับวัตถุประเภทนี้หรือไม่ แต่ถ้าคุณพยายามที่จะได้รับธาตุออกจากรายชื่อดังกล่าวคุณแน่นอนจะได้รับวัตถุของการพิมพ์Any?
เพราะวัตถุทั้งหมดใน Kotlin Any
สืบทอดมาจาก
จากความคิดเห็นของascoด้านล่าง:
นอกจากนี้
List<*>
ยังสามารถมีอ็อบเจ็กต์ประเภทใดก็ได้ แต่มีเพียงประเภทนั้นดังนั้นจึงสามารถมี Strings (แต่มีเพียง Strings) ในขณะที่List<Any>
สามารถมี Strings และ Integers และ whatnot ทั้งหมดอยู่ในรายการเดียวกัน
ในบริบทที่ฉันคิดว่าคุณบ่งบอกถึงจะเทียบเท่ากับSomeGeneric<*>
SomeGeneric<out Any?>
เทียบเท่ากับ Java คือSomeGeneric<? extends Object>
.
ไวยากรณ์ที่เรียกว่า "star-projections" นี่คือเอกสารอย่างเป็นทางการ: https://kotlinlang.org/docs/reference/generics.html#star-projections