Generic Type의 형변환 & 제거

0

Generic

목록 보기
6/6
  • 지네릭 타입과 원시 타입 간의 형변환은 바람직하지 않다. (경고 발생)
	Box<Object> objBox = null;
    Box box = null;
	Box box = (Box)objBox; // ok, 지네릭 타입 -> 원시타입, 경고 발생
	objBox = (Box<Object>)box; // ok, 원시타입 -> 지네릭 타입, 경고 발생

	objBox = (Box<Object>)strBox; // 에러, Box<String> -x> Box<Object>
	strBox = (Box<String>)objBox; // 에러, Box<Object> -x> 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>(); // 위 문장과 동일

지네릭 타입의 제거

  • 컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.
  1. 지네릭 타입의 경계(bound)를 제거
class Box<T extends Fruit>{
	void add(T t){
		. . . .
	}
}

위 코드를 컴파일 하면

class Box {
	void add(Fruit t) { 
		. . . 
	}
}

으로 변환이 된다. 지네릭 타입이 제거 되고 T가 Object로 변환 된다.
하위 호환성, 즉 JDK1.5 버전 지네릭이 포함된 이전 버전과 호환이 가능하게 되도록 하기 위함이다.

  1. 지네릭 타입 제거 후에 타입이 불일치하면, 형변환을 추가

  2. 와일드 카드가 포함된 경우, 적절한 타입으로 형변환 추가

0개의 댓글