지네릭 타입의 형변환
- 지네릭 타입과 원시 타입 간의 형변환은 바람직하지 않다.(경고 발생)
Box<Object> objBox = null; Box box = (Box)objBox; // OK. 지네릭 타입 → 원시타입. 경고발생 objBox = (Box<Object>)box; // // OK. 원시타입 → 지네릭타입. 경고발생
- 서로 다른 타입이 대입된 지네릭타입들끼리는 형변환 안됨.
- 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능
↳ String은 Object의 자손이기 때문에 형변환이 가능
↳ 3번째 줄 new 연산자 앞에(Box<? extends Object>)
형변환이 생략된 것
✔︎ 지네릭 타입의 제거 : 컴파일러는 지네릭 타입을 제거!!하고, 필요한 곳에 형변환을 넣는다.
1) 지네릭 타입의 경계(bound)를 제거
Object 대신
<T>
썼던 것을 컴파일하면 원래대로<T>
→ Object 로 변환됨
∵ 하위호환성. 이전 버전(JDK1.5 이전)과 무리없이 돌아가게 하려고 타입을 제거.
→ 지네릭스 도입 전,후가 다를게 없음. 지네릭스는 타입은 컴파일타임에만 존재함
⇒ java는 하위호환성을 중시하기 때문이다.(안정성↑)
↳ extends로 제한된 경우 object가 아닌 제한된 타입으로 바뀐다.2) 지네릭 타입 제거 후에 타입이 불일치하면, 형변환을 추가
3) 와일드 카드가 포함된 경우, 제거할 때 적절한 타입으로 형변환 추가해줘야 함
출처
- 자바의 정석 기초편 : ch 12 - 15~16