Java 제네릭을 배열로 사용할 수없는 이유는 무엇입니까?


10

ArrayLists 배열을 만들려고 할 때 왜 ArrayList<Integer>[] arr=new ArrayList<Integer>[40];오류가 있고 java가 이것을 허용하지 않습니까?

java의 제네릭, 모든 언어의 제네릭 또는 임의의 구현에 관련된 이유가 있습니까?


답변:


20

이것은 Java 제네릭의 주요한 구멍 중 하나이며, 배열은 공 변형입니다 . 즉, 유형의 배열 Foo[]Object[]및 의 하위 클래스입니다 ParentOfFoo[]. List<Foo>이 동작이없는 것과 대조하십시오 .

Java에 제네릭이없는 경우 (Java 5까지) 그렇지 않으면 제네릭 정렬 기능과 같은 것이 불가능했기 때문에 중요했습니다.

그러나 배열이 런타임에 어떤 유형인지 알고 싶어하는 까다로운 문제가 있습니다 . 그러나 Java의 제네릭은 유형 삭제를 기반으로합니다. 이 두 가지가 전혀 잘 맞지 않아 문제가 발생합니다.

Java 1에서는 공변량 배열이 제네릭이 부족한 구멍을 부분적으로 채웠습니다. 그러나이 구멍을 제대로 채우려 고 할 때 이전 버전과의 호환성으로 인해 어레이를 구현하기가 거의 불가능했습니다.

실제로 제네릭의 프레임 워크를 만든 사람인 Martin Odersky는 여기 에서 그가 왜 Scala를 만들 었는지에 대한 인터뷰에서 이에 대해 이야기했습니다 . (스칼라의 역사에 관심이 있다면 매우 매력적입니다)


3

java의 제네릭, 모든 언어의 제네릭 또는 임의의 구현에 관련된 이유가 있습니까?

실제로는 다소 임의적입니다.

문제는 타입 시스템에 구멍을 낼 수 있다는 것입니다. 왜냐하면 ArrayList<T>[]캐스팅 할 수 있고 배열에를 Object[]넣을 수 있기 때문 입니다.ArrayList<U>U != T

Java 디자이너는 전혀 허용하지 않음으로써이 구멍을 최대한 차단하기로 결정했습니다 new ArrayList<T>[N].

그러나 "확인되지 않은"경고없이 제네릭 배열의 업 캐스팅을 허용하지 않음으로써 플러그 될 수도 있습니다.


이 답변은 과소 평가되었습니다. 매우 간단하고 모호한 용어에 전문 용어를 사용하지 않습니다. 매우 감사합니다.
Tung Nguyen

이것은 당신이를 넣어 경우에 다른 이유 당신은에 정교하게 할 수 있습니다 IntegerObject[]사실입니다String[]
Caleth

-3

때문에 배열 공변이며 이 때문에 예외를 주조하기 위해 실행 시간 에러를 제공하므로 모든 종류의 객체의 하위 클래스이다. 그동안 제네릭은 불변 이 유형을 기반으로 그렇게 할 때 확인 또는 유형 안전 그래서 그것은 컴파일러 오류를 제공 입력 생성되지 같이 입력하면.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.