본문 바로가기

Java

[Java] 지네릭 타입의 형변환

지네릭 타입과 원시 타입 간의 형변환은 바람직 하지 않다.(경고 발생)

Box<Object> objBox = null;
Box box = (Box)objBox; // OK. 지네릭 타입 => 원시 타입. 경고 발생
objBox = (Box<Object>)box; // OK. 원시타입 => 지네릭타입. 경고 발생

 

Box<Object> object = null;
Box<String> strBox = null;

objBox = (Box<String>)strBox; // 에러. Box<String> => Box<Object>
strBox = (Box<String>)objBox; // 에러. Box<Object> => Box<String>

 

와일드 카드가 사용된 지네릭 타입으로는 형변환 가능

Box<Object> objBox = (Box<Object>)new Box<String>(); // 에러. 형변환 불가능
Box<extends Object> wBox = (Box<? extends Object> new Box<String>(); // OK
Box<extends Object> wBox = new Box<String>(); // 위 문장과 동일
FruitBox<? extends Fruit> fBox = (FruitBox<? extends Fruit>)new FruitBox<Fruit>();
// FruitBox<Apple> => FruitBox<? extends Fruit>
FruitBox<? extends Apple> aBox = new FruitBox<Apple>(); // 생략
// FruitBox<? extends Fruit> => FruitBox<Apple> 가능?
FruitBox<Apple> apBox = (FruitBox<Apple>) aBox; // OK. 경고발생

 

지네릭 타입의 제거

컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.(하위 호환성 이슈 - 안전성)

  1. 지네릭 타입의 경계(bound)를 제거
  2. 지네릭 타입 제거 후에 타입이 불일치하면, 형변환을 추가
  3. 와일드 카드가 포함된 경우, 적절한 타입으로 형변환 추가

 

 

'Java' 카테고리의 다른 글

[Java] Jshell 을 아시나요?  (1) 2024.09.26
[Java 복습] 타입 매개변수 제한  (0) 2024.05.10
[Java] 와일드 카드, 지네릭 메서드  (0) 2024.05.10
[Java] 지네릭 클래스의 제약  (0) 2024.05.10
[Java] Iterator<E>, Map<K, V>  (0) 2024.05.09