ผมไม่แน่ใจว่าผมเข้าใจความแตกต่างระหว่างและSomeGeneric<*> SomeGeneric<Any>ฉันคิดว่า*แสดงถึงอะไรก็ได้ (สัญลักษณ์แทน) และAnyแสดงถึงวัตถุที่วัตถุทั้งหมดสืบทอดมา ดูเหมือนว่าพวกเขาควรจะเหมือนกัน แต่พวกเขา?
ผมไม่แน่ใจว่าผมเข้าใจความแตกต่างระหว่างและSomeGeneric<*> SomeGeneric<Any>ฉันคิดว่า*แสดงถึงอะไรก็ได้ (สัญลักษณ์แทน) และAnyแสดงถึงวัตถุที่วัตถุทั้งหมดสืบทอดมา ดูเหมือนว่าพวกเขาควรจะเหมือนกัน แต่พวกเขา?
คำตอบ:
อาจเป็นประโยชน์หากคิดว่าการฉายภาพของดวงดาวเป็นวิธีการแสดงไม่ใช่แค่ประเภทใดประเภทหนึ่ง แต่เป็นประเภทตายตัวบางประเภทซึ่งคุณไม่รู้ว่าคืออะไรกันแน่
ตัวอย่างเช่นประเภทMutableList<*>แสดงรายการของบางสิ่งบางอย่าง (คุณไม่รู้ว่าคืออะไร) ดังนั้นหากคุณพยายามเพิ่มบางอย่างในรายการนี้คุณจะไม่ประสบความสำเร็จ อาจเป็นรายการStrings หรือรายการInts หรือรายการอื่น ๆ คอมไพเลอร์ไม่อนุญาตให้ใส่วัตถุใด ๆ ในรายการนี้เลยเนื่องจากไม่สามารถตรวจสอบได้ว่ารายการยอมรับวัตถุประเภทนี้หรือไม่ แต่ถ้าคุณพยายามที่จะได้รับธาตุออกจากรายชื่อดังกล่าวคุณแน่นอนจะได้รับวัตถุของการพิมพ์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