여러개의 Set을 배열로 구현해서 다음과 같이 add하면 warning이 뜬다.
Set[] set = new Set[2];
set[0] = new HashSet<>();
set[0].add(0);
add 시 warning: add하는 값의 type check가 보장이 안되어서인 것 같다.
Unchecked call to 'add(E)' as a member of raw type 'java.util.Set'
"How to make an array of map" 왜 Map으로 배열을 만들 수 없는지 더 찾아보았고, 그 이유는 제너릭 타입은 타입 추론이 일어나기 때문에 typesafe 하지 않아 ClassCastException 런타임 오류가 발생할 수 있어서이다.
예를 들어서, 아래처럼 선언을 했다고 했을 때,
List<String>[] stringLists = new List<String>[1]; // (1)
List<Integer> intList = Arrays.asList(42); // (2)
Object[] objects = stringLists; // (3)
objects[0] = intList; // (4)
// String s = stringLists[0].get(0); // (5)
(1) List<> 타입의 배열 선언 (컴파일에러)
(2) 42값을 지닌 Integer 형 리스트 선언 및 초기화
(3) Objects <- List 로 배열 담는다. 배열은 공변
(4) Object 배열의 0번째에 List 형을 담는다.
런타임에서 제너릭 타입은 소거되어 List로만 있어서 Object[] <-List[](3번째 라인), Object <- List(4번째 라인)인 셈이다. List<String> 타입의 배열에 List<Integer>의 값을 배열의 0번째에 넣었으므로 문제가 발생한다.
(5) 컴파일러는 반환 값을 String으로 변환하지만 stringLists[0].get(0)에는 Integer 타입의 값이 담겨 런타임에서 ClassCastException
이 발생한다.
그럼 제너릭 타입은 어떻게?
Collection(List)를 활용하여 구현한다.
Collection을 이용하여 제너릭 타입의 배열을 구현하기
List<Set<Integer>> setList = new ArrayList<>();
setList.add(new HashSet<>());
참고한 스택오버플로우 답변:
https://stackoverflow.com/questions/1493162/how-does-one-instantiate-an-array-of-maps-in-java
추가 공부한 블로그:
https://pompitzz.github.io/blog/Java/whyCantCreateGenericsArray.html
'Java&Kotlin' 카테고리의 다른 글
[Kotlin] Collection 의 크기가 작은 경우 Sequence 가 성능이 더 떨어질 수 있는 이유 (0) | 2022.10.10 |
---|---|
[Kotlin] 제네릭스 (0) | 2022.05.21 |
[Kotlin] 클래스와 인터페이스 (0) | 2022.04.27 |
[JAVA] HashMap,HashSet에서 Object를 key로 가지는 경우 get() (0) | 2022.03.11 |