เป็นที่ยอมรับกันโดยทั่วไปว่า Java generics ล้มเหลวในบางวิธีที่สำคัญ การรวมกันของ wildcard และขอบเขตทำให้รหัสบางอย่างไม่สามารถอ่านได้อย่างจริงจัง
อย่างไรก็ตามเมื่อฉันดูภาษาอื่น ๆ ฉันก็ดูเหมือนจะไม่พบระบบแบบทั่วไปที่โปรแกรมเมอร์มีความสุข
ถ้าเราทำสิ่งต่อไปนี้เป็นเป้าหมายการออกแบบของระบบประเภท:
- สร้างการประกาศประเภทที่อ่านง่ายเสมอ
- ง่ายต่อการเรียนรู้ (ไม่จำเป็นต้องปัดเรื่องความแปรปรวนร่วมความแปรปรวน ฯลฯ )
- เพิ่มจำนวนข้อผิดพลาดในการคอมไพล์ให้สูงสุด
มีภาษาใดบ้างที่ทำให้ถูกต้อง? ถ้าฉัน google สิ่งเดียวที่ฉันเห็นคือการร้องเรียนเกี่ยวกับวิธีที่ระบบประเภทดูดในภาษา X. ความซับซ้อนแบบนี้มีอยู่ในการพิมพ์ทั่วไปหรือไม่? เราควรยอมแพ้ในการพยายามตรวจสอบความปลอดภัย 100% ณ เวลารวบรวมหรือไม่?
คำถามหลักของฉันคือภาษาใดที่ "เข้าใจถูกต้อง" ที่สุดด้วยความเคารพต่อเป้าหมายทั้งสามนี้ ฉันรู้ว่ามันเป็นแบบอัตนัย แต่จนถึงตอนนี้ฉันไม่สามารถหาภาษาใดภาษาหนึ่งได้ที่โปรแกรมเมอร์ไม่ใช่ทุกคนยอมรับว่าระบบประเภททั่วไปนั้นเป็นระเบียบ
ภาคผนวก: ดังที่กล่าวไว้การรวมกันของการพิมพ์ย่อย / การสืบทอดและข้อมูลทั่วไปเป็นสิ่งที่สร้างความซับซ้อนดังนั้นฉันจึงกำลังมองหาภาษาที่ผสมผสานทั้งสองอย่างและหลีกเลี่ยงการระเบิดของความซับซ้อน
Foo<T> where SiameseCat:T
) และไม่มีความเป็นไปได้ที่จะมีประเภททั่วไปที่ไม่สามารถเปลี่ยนObject
ได้ IMHO, .NET จะได้รับประโยชน์จากประเภทรวมซึ่งคล้ายกับโครงสร้าง แต่ยิ่งไม่มีกระดูก หากKeyValuePair<TKey,TValue>
เป็นประเภทดังกล่าวIEnumerable<KeyValuePair<SiameseCat,FordFocus>>
จะสามารถส่งไปที่IEnumerable<KeyValuePair<Animal,Vehicle>>
ได้ แต่จะไม่สามารถวางประเภทได้
easy-to-read type declarations
อะไร เกณฑ์ที่สามนั้นยังคลุมเครือ: ตัวอย่างเช่นฉันสามารถเปลี่ยนดัชนีอาร์เรย์ออกจากข้อยกเว้นของขอบเขตเป็นข้อผิดพลาดในการรวบรวมเวลาโดยไม่ให้คุณทำดัชนีอาร์เรย์ยกเว้นว่าฉันสามารถคำนวณดัชนีในเวลารวบรวมได้ นอกจากนี้เกณฑ์ที่สองยังกำหนดกฎการพิมพ์ย่อย นั่นไม่ใช่สิ่งเลวร้าย แต่คุณควรระวังสิ่งที่คุณถาม