ผ่านวิกิพีเดีย :
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);