Wikipedia를 통해 :
Java 및 C #의 초기 버전에는 제네릭 (일명 파라 메트릭 다형성)이 포함되지 않았습니다.
이러한 설정에서, 배열을 변하지 않게 만드는 것은 유용한 다형성 프로그램을 배제합니다. 예를 들어, 배열을 섞기위한 함수 또는 Object.equals
요소 의 메소드를 사용하여 두 배열의 동등성을 테스트하는 함수를 작성해보십시오 . 구현은 배열에 저장된 정확한 유형의 요소에 의존하지 않으므로 모든 유형의 배열에서 작동하는 단일 함수를 작성할 수 있어야합니다. 유형의 기능을 쉽게 구현
boolean equalArrays (Object[] a1, Object[] a2);
void shuffleArray(Object[] a);
그러나 배열 유형이 변하지 않는 것으로 취급되면 정확히 유형의 배열에서만 이러한 함수를 호출 할 수 있습니다 Object[]
. 예를 들어 문자열 배열을 섞을 수 없었습니다.
따라서 Java와 C # 모두 배열 유형을 공변량으로 취급합니다. 예를 들어 C # string[]
에서 하위 유형은 object[]
이고 Java String[]
에서 하위 유형은 Object[]
입니다.
이것은 "왜, 더 정확하게"? 배열이 공변 왜 "라는 질문에 응답, 또는 했다 공변을 만든 배열 시간에 ?"
제네릭이 소개되었을 때 Jon Skeet 의이 답변 에서 지적한 이유로 의도적으로 공변량이되지 않았습니다 .
아니요, a 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?
갑자기 당신은 매우 혼란스러운 고양이 를 가지고 있습니다 .
와일드 카드 는 공분산 (및 공분산) 표현을 가능하게 했기 때문에 위키 백과 기사에 설명 된 배열을 공변량으로 만드는 원래 동기는 제네릭에 적용되지 않았습니다 .
boolean equalLists(List<?> l1, List<?> l2);
void shuffleList(List<?> l);