ความแตกต่างระหว่าง“ *” และ“ Any” ใน Kotlin generics


107

ผมไม่แน่ใจว่าผมเข้าใจความแตกต่างระหว่างและSomeGeneric<*> SomeGeneric<Any>ฉันคิดว่า*แสดงถึงอะไรก็ได้ (สัญลักษณ์แทน) และAnyแสดงถึงวัตถุที่วัตถุทั้งหมดสืบทอดมา ดูเหมือนว่าพวกเขาควรจะเหมือนกัน แต่พวกเขา?

คำตอบ:


160

อาจเป็นประโยชน์หากคิดว่าการฉายภาพของดวงดาวเป็นวิธีการแสดงไม่ใช่แค่ประเภทใดประเภทหนึ่ง แต่เป็นประเภทตายตัวบางประเภทซึ่งคุณไม่รู้ว่าคืออะไรกันแน่

ตัวอย่างเช่นประเภทMutableList<*>แสดงรายการของบางสิ่งบางอย่าง (คุณไม่รู้ว่าคืออะไร) ดังนั้นหากคุณพยายามเพิ่มบางอย่างในรายการนี้คุณจะไม่ประสบความสำเร็จ อาจเป็นรายการStrings หรือรายการInts หรือรายการอื่น ๆ คอมไพเลอร์ไม่อนุญาตให้ใส่วัตถุใด ๆ ในรายการนี้เลยเนื่องจากไม่สามารถตรวจสอบได้ว่ารายการยอมรับวัตถุประเภทนี้หรือไม่ แต่ถ้าคุณพยายามที่จะได้รับธาตุออกจากรายชื่อดังกล่าวคุณแน่นอนจะได้รับวัตถุของการพิมพ์Any?เพราะวัตถุทั้งหมดใน Kotlin Anyสืบทอดมาจาก

จากความคิดเห็นของascoด้านล่าง:

นอกจากนี้List<*>ยังสามารถมีอ็อบเจ็กต์ประเภทใดก็ได้ แต่มีเพียงประเภทนั้นดังนั้นจึงสามารถมี Strings (แต่มีเพียง Strings) ในขณะที่List<Any> สามารถมี Strings และ Integers และ whatnot ทั้งหมดอยู่ในรายการเดียวกัน


83
คำตอบที่ดีสำหรับบางคนอาจเป็นประโยชน์ในการเพิ่มว่า List <*> สามารถมีออบเจ็กต์ประเภทใดก็ได้แต่มีเพียงประเภทนั้นดังนั้นจึงสามารถมี Strings (แต่มีเพียง Strings) ในขณะที่ List <Any> สามารถมี Strings และจำนวนเต็มและ อะไรทั้งหมดอยู่ในรายการเดียวกัน
fweigl

1
นี่คือบทความที่น่าสนใจพร้อมคำอธิบายที่คล้ายกัน: typealias.com/guides/star-projections-and-how-they-work
croc

29

ในบริบทที่ฉันคิดว่าคุณบ่งบอกถึงจะเทียบเท่ากับSomeGeneric<*> SomeGeneric<out Any?>เทียบเท่ากับ Java คือSomeGeneric<? extends Object>.

ไวยากรณ์ที่เรียกว่า "star-projections" นี่คือเอกสารอย่างเป็นทางการ: https://kotlinlang.org/docs/reference/generics.html#star-projections

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.