본문 바로가기
java

Generics 05 제네릭 형 변환

by 킹차니 2022. 1. 4.

제네릭 타입의 형 변환

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

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

Box<String> strBox = null;
objBox = (Box<Object>)strBox; // ERROR. Box<String> -> Box<Obejct>
strBox = (Box<String>)objBox; // ERROR. Box<Obejct> -> Box<String>

 

-와일드 카드가 선언된 제네릭 타입으로는 형변환 가능

Box<Object> objBox = (Box<Object>)new Box<String>(); // ERROR. 형변환 불가능
Box<? extends Object> wBox = (Box<? extends Object>)new Box<String>(); // OK
Box<? extends Object> wBox = new Box<String>(); // 위 문장과 동일

 

 

 

 

제네릭 타입의 제거

- 컴파일러는 제네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.

- 제네릭이 도입되면서 Object타입을 모두 <T>로 바꿨는데, 컴파일하면 다시 <T>가 Object로 바뀐다.

 

1.제네릭 타입의 경계(bound)를 제거

class Box<T extends Fruit>{
	void add(T t){
		...
	}
}

//아래와 같이 제거한다.
class Box{
	void add(Fruit t){
		...
	}
}

 

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

T get(int i){
	return list.get(i);
}

//아래와 같이 형변환 추가
Fruit get(int i)
	return (Fruit)list.get(i);
}

 

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

 

 

 

출처: 남궁성님 유튜브 강의
https://www.youtube.com/user/MasterNKS