ผ่านวิกิพีเดีย :
Java เวอร์ชันแรกและ C # ไม่ได้รวม generics (หรือที่รู้จักว่าตัวแปรเชิงตัวแปร)
ในการตั้งค่าดังกล่าวทำให้อาร์เรย์มีค่าคงที่ออกกฎโปรแกรม polymorphic ที่มีประโยชน์ ตัวอย่างเช่นลองเขียนฟังก์ชั่นเพื่อสุ่มอาร์เรย์หรือฟังก์ชั่นที่ทดสอบสองอาร์เรย์เพื่อความเท่าเทียมกันโดยใช้Object.equals
วิธีการในองค์ประกอบ การใช้งานไม่ได้ขึ้นอยู่กับชนิดขององค์ประกอบที่แน่นอนที่เก็บไว้ในอาเรย์ดังนั้นจึงควรจะสามารถเขียนฟังก์ชั่นเดียวที่ใช้งานได้กับอาเรย์ทุกประเภท มันง่ายที่จะใช้ฟังก์ชั่นประเภท
boolean equalArrays (Object[] a1, Object[] a2);
void shuffleArray(Object[] a);
อย่างไรก็ตามถ้าประเภทอาร์เรย์ได้รับการปฏิบัติเหมือนไม่คงที่จะสามารถเรียกฟังก์ชันเหล่านี้ได้ในอาร์เรย์ที่มีชนิดObject[]
ทั้งหมดเท่านั้น ตัวอย่างเช่นไม่สามารถสับเปลี่ยนอาร์เรย์ของสตริงได้
ดังนั้นทั้ง Java และ C # จึงจัดการกับประเภทอาเรย์อย่างต่อเนื่อง ยกตัวอย่างเช่นใน C # string[]
เป็นชนิดย่อยของobject[]
และ Java เป็นชนิดย่อยของString[]
Object[]
นี้จะตอบคำถามที่ว่า "ทำไมอาร์เรย์ covariant?" หรืออย่างแม่นยำมากขึ้น "ทำไมมีอาร์เรย์ covariant ทำในเวลานั้น ?"
เมื่อแนะนำยาชื่อสามัญพวกเขาไม่ได้ทำโควาเรียนท์ด้วยเหตุผลที่ชี้ให้เห็นในคำตอบนี้โดย Jon Skeet :
ไม่มีที่ไม่ได้เป็นList<Dog>
List<Animal>
พิจารณาสิ่งที่คุณสามารถทำได้ด้วยList<Animal>
- คุณสามารถเพิ่มสัตว์ใด ๆ ลงไป ... รวมถึงแมว ทีนี้คุณสามารถเพิ่มแมวเข้าไปในลูกสุนัขได้ไหม? ไม่ได้อย่างแน่นอน.
// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new List<Dog>();
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?
ทันใดนั้นคุณมีแมวที่สับสนมาก
แรงจูงใจดั้งเดิมสำหรับการทำอาร์เรย์ covariant ที่อธิบายไว้ในบทความ wikipedia ไม่ได้ใช้กับยาสามัญเพราะสัญลักษณ์ตัวแทนทำให้การแสดงออกของความแปรปรวนร่วม (และความแปรปรวน) เป็นไปได้เช่น:
boolean equalLists(List<?> l1, List<?> l2);
void shuffleList(List<?> l);