답변:
이것은 Java 제네릭의 주요한 구멍 중 하나이며, 배열은 공 변형입니다 . 즉, 유형의 배열 Foo[]
은 Object[]
및 의 하위 클래스입니다 ParentOfFoo[]
. List<Foo>
이 동작이없는 것과 대조하십시오 .
Java에 제네릭이없는 경우 (Java 5까지) 그렇지 않으면 제네릭 정렬 기능과 같은 것이 불가능했기 때문에 중요했습니다.
그러나 배열이 런타임에 어떤 유형인지 알고 싶어하는 까다로운 문제가 있습니다 . 그러나 Java의 제네릭은 유형 삭제를 기반으로합니다. 이 두 가지가 전혀 잘 맞지 않아 문제가 발생합니다.
Java 1에서는 공변량 배열이 제네릭이 부족한 구멍을 부분적으로 채웠습니다. 그러나이 구멍을 제대로 채우려 고 할 때 이전 버전과의 호환성으로 인해 어레이를 구현하기가 거의 불가능했습니다.
실제로 제네릭의 프레임 워크를 만든 사람인 Martin Odersky는 여기 에서 그가 왜 Scala를 만들 었는지에 대한 인터뷰에서 이에 대해 이야기했습니다 . (스칼라의 역사에 관심이 있다면 매우 매력적입니다)
java의 제네릭, 모든 언어의 제네릭 또는 임의의 구현에 관련된 이유가 있습니까?
실제로는 다소 임의적입니다.
문제는 타입 시스템에 구멍을 낼 수 있다는 것입니다. 왜냐하면 ArrayList<T>[]
캐스팅 할 수 있고 배열에를 Object[]
넣을 수 있기 때문 입니다.ArrayList<U>
U != T
Java 디자이너는 전혀 허용하지 않음으로써이 구멍을 최대한 차단하기로 결정했습니다 new ArrayList<T>[N]
.
그러나 "확인되지 않은"경고없이 제네릭 배열의 업 캐스팅을 허용하지 않음으로써 플러그 될 수도 있습니다.
Integer
에 Object[]
사실입니다String[]