지네릭 타입의 형변환 & 제거

0

지네릭 타입의 형변환

  • 지네릭 타입과 원시 타입 간의 형변환은 바람직하지 않다.(경고 발생)
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
profile
백엔드를 공부하고 있습니다.

0개의 댓글