J.Y.S
¿ whats my interest ?
J.Y.S
전체 방문자
오늘
어제
  • 분류 전체보기 (59)
    • 트러블슈팅 기록 (7)
    • Java&Kotlin (5)
    • Server (22)
    • 데이터 엔지니어링 (3)
    • Architecture& Design Patter.. (1)
    • Daily (11)
    • 알고리즘 공부 (9)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
J.Y.S
Java&Kotlin

[JAVA] 제너릭 타입으로 배열을 만들 수 없는 이유 (타입 추론)

Java&Kotlin

[JAVA] 제너릭 타입으로 배열을 만들 수 없는 이유 (타입 추론)

2022. 3. 9. 17:03

여러개의 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

 

How does one instantiate an array of maps in Java?

I can declare an array of maps using generics to specify the map type: private Map<String, Integer>[] myMaps; However, I can't figure out how to instantiate it properly: myMaps = new HashM...

stackoverflow.com

추가 공부한 블로그:

https://pompitzz.github.io/blog/Java/whyCantCreateGenericsArray.html

 

JAVA 제네릭 배열을 생성하지 못하는 이유 | BLOG

JAVA 제네릭 배열을 생성하지 못하는 이유 작성일: 2020-07-18 14:28 자바에서 제네릭 타입은 중요한 두 가지 차이를 가지고, 이 차이로 인해 제네릭 배열은 타입 안전성을 보장할 수 없어 직접 생성이

pompitzz.github.io

 

저작자표시 (새창열림)

'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
    'Java&Kotlin' 카테고리의 다른 글
    • [Kotlin] Collection 의 크기가 작은 경우 Sequence 가 성능이 더 떨어질 수 있는 이유
    • [Kotlin] 제네릭스
    • [Kotlin] 클래스와 인터페이스
    • [JAVA] HashMap,HashSet에서 Object를 key로 가지는 경우 get()
    J.Y.S
    J.Y.S

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.