지네릭 타입과 원시 타입간의 형변환을 해보자
경고가 발생하지만 가능하다
Box box= null;
Box<ObjBox> = null;
box = (box)objBox; //지네릭 타입-> 원시타입 ok. but 경고발생
ObjBox=(Box<Object>)box; // 원시타입- >지네릭 ok. but 경고발생
지네릭 타입과 지네릭 타입
Box<Object> objbox= null;
Box<String> strbox= null;
box = (box)objBox; //지네릭 타입-> 원시타입 ok. but 경고발생
ObjBox=(Box<Object>)box; // 원시타입- >지네릭 ok. but 경고발생
하지만!
Box<? extends Object>wBox = new Box<String>()_ // 가능
FruitBox<? extends Fruit> box= new FruitBox<Fruit>()// ok
FruitBox<? extends Fruit> box= new FruitBox<Apple>()// ok
FruitBox<? extends Fruit> box= new FruitBox<Graoge>()// ok
반대로의 형변환도 성립하지만 , 확인되지 않은 형변환이라는 경고가 발생한다. FruitBox <? extends Fruit> 에 대입될수 있는 타입이 여러 개인데다 Fruit 를 제외한 다른 타입은 FruitBox 로 형변활 될 수 없기 떄문이다.
왼쪽은 와일드 카드로 Fruit 나 fruit의 자손 apple,grape 가 가능하다. 두번쨰줄 왼쪽에 grape가(조건상 들어 올수있다) 들어오면 apple로 변환 불가능 하기 떄문에 오류 발생
Optional<? extends Object> wopt= new Optional<Object>()
Optional<Object> oopt= new Optional<Object>()
Optional sopt=(Optional<String>)wopt; //ok
Optional sopt=(Optional<String>)oopt; // 불가
->Optional 는 Optional<T> 로 형변환 불가
지네릭 타입의 경계를 제거한다. 지네릭 타입이 <T extends Fruit> 라면 T는 Fruit로 치환된다 . <T> 의 경우는T는 object로 치환 지네릭 타입을 제거한 후에 타입이 일치하지 않으면 형변환 추가 지네릭은 컴파일후 사라진다지네릭 타입의 제거