제네릭 타입의 형 변환
-제네릭 타입과 원시 타입 간의 형변환은 바람직하지 않다.(경고 발생)
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
'java' 카테고리의 다른 글
Enum 열거형 (0) | 2022.04.15 |
---|---|
Generics 05 와일드 카드, 제네릭 메서드 (0) | 2022.01.04 |
Generics 04 제한된 제네릭 클래스(제네릭스의 제약) (0) | 2022.01.03 |
Generics 03 Iterator, HashMap과 제네릭스 (0) | 2022.01.03 |
Generics 02 제네릭스 용어, 제네릭 타입과 다형성 (0) | 2022.01.02 |