12-15~16 지네릭 타입의 형변환, 지네릭 타입의 제거

oyeon·2020년 12월 28일
0

Java 개념

목록 보기
43/70

지네릭 타입의 형변환

  • 지네릭 타입과 원시 타입 간의 형변환은 바람직 하지 않다.(경고 발생)
Box<Object> objBox = null;
Box box = (Box)objBox;		// OK. 지네릭 타입 -> 원시 타입. 경고 발생
objBox = (Box<Object>)box;	// OK. 원시 타입 -> 지네릭 타입. 경고 발생
Box b = new Box<String>();	// OK. 경고 발생
  • 다른 지네릭 타입간 형변환 불가능
Box<Object> objBox = null;
Box<String> strBox = null;
objBox = (Box<Object>)strBox;	// Error!! Box<String> -> Box<Object> 불가능
strBox = (Box<String>)objBox;	// Error!! Box<Object> -> Box<String> 불가능
Box<Object> b = new Box<String>();	// Error!!
  • 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능
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<Fruit>, FruitBox<Apple>, FruitBox<Grape> 등이 가능
static Juice makeJuice(FruitBox<? extends Fruit> box){ ... }

FruitBox<? extends Fruit> fruitBox = new FruitBox<Fruit>();	// OK. 형변환 생략 허용
FruitBox<? extends Fruit> appleBox = new FruitBox<Apple>();	// OK. 형변환 생략 허용
FruitBox<Fruit> fruitBox = (FruitBox<? extends Fruit>)new FruitBox<Fruit>(); // OK
FruitBox<Apple> appleBox = (FruitBox<? extends Fruit>)new FruitBox<Apple>(); // OK

지네릭 타입의 제거

  • 컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.
    <'T'> -> Object. 하위 호완성을 위해서. 안정성 추구.
  • 지네릭 타입 제거 후에 타입이 불일치하면, 형변환을 추가
  • 와일드 카드가 포함된 경우, 적절한 타입으로 형변환 추가
profile
Enjoy to study

0개의 댓글