런타임에 벌어지는 일
1. type parameter T는 전부 Object로 바뀐다.
2. <> 전부 지워지고 Generic type과 Raw type은 서로 같아진다.
예시
1-1.
T[] arr = new T[10]; → 컴파일 X ( 제네릭 배열 막아놨음 )
1-2.
T[] arr = (T[]) new Object[10]; → OK!
(런타임)
Object[] arr = (Object[]) new Object[10] ▶ Object[] 객체를 Object[] 로 downcast ▶ OK!
2-1.
LinkedList<T>[] arr = new LinkedList<T>[10]; → 컴파일 X ( 제네릭 배열 막아놨음 )
2-2.
LinkedList<T>[] arr = (LinkedList<T>[])new Object[10]; → 런타임 X ( ClassCastException )
(런타임)
LinkedList[] arr = (LinkedList[]) new Object[10] ▶ Object[] 객체를 LinkedList[] 로 downcast ▶ ClassCastException
2-3.
LinkedList<T> [] arr = (LinkedList<T>[]) new LinkedList[10]; → OK!
(런타임)
LinkedList[] arr = (LinkedList[]) new LinkedList[10] ▶ LinkedList[] 객체를 LinkedList[] 로 downcast ▶ OK!
결론
제네릭은 컴파일 이전에 타입 안정성을 보장하는 기능만을 제공한다.
컴파일이 끝나면 모든 코드가 그냥 구버전(raw type version)과 같아진다.
참고
https://stackoverflow.com/questions/1206028/java-raw-type-and-generics-interaction
'프로그래밍 언어 > Java' 카테고리의 다른 글
클래스 클래스 (0) | 2022.05.31 |
---|---|
인텔리제이 단축키 (0) | 2022.05.31 |
음수 정수의 비트 표현 (0) | 2022.04.13 |
Iterable & Iterator (0) | 2022.04.11 |
모듈과 패키지 (0) | 2022.04.10 |