상속
이 가능하다.와일드카드 기반 메소드의 정의가 더 간결하다는 장점이 있다.
public static <T> void peekBox(Box<T> box){
System.out.println(box);
} // 제네릭 메소드의 정의
public static void peekBox(Box<?> box){
System.out.println(box);
} // 와일드카드 기반 메소드 정의
public static void peekBox(Box<? super Integer> box){
System.out.println(box);
}
class Box<T> {
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
class Toy {
public String toString(){
return "I am a Toy";
}
}
class BoxHandler {
public static void outBox(Box<Toy> box){
Toy t = box.get(); // 상자에서 꺼내기
System.out.println(t);
}
public static void inBox(Box<Toy> box, Toy n){
box.set(n) // 상자에 넣기
}
}
class Box<T> {
private T ob;
public void set(T o ) { ob = o; }
public T get() { return ob; }
}
...
public static void outBox(Box<? extends Toy> box){
box.get(); // 꺼내는 것! OK
box.set(new Toy()); //넣는 것! ERROR
}
class Car extends Toy {...} // 자동차 장난감
class Robot extends Toy {...} // 로봇 장난감
// 다음과 같이 정리하자!
Box<? extends Toy> box 대상으로 넣는 것 불가!!
상한 제한을 하면 꺼내는 것은 가능하지만, 값 셋팅은 불가능하다.
class Box<T> {
private T ob;
public void set(T o ) { ob = o; }
public T get() { return ob; }
}
...
public static void inBox(Box<Toy> box, Toy n){
box.set(n) // 상자에 넣기
Toy myToy = box.get(); // **꺼내는 것! Error**
}
// 다음과 같이 정리하자!
Box<? super Toy> box 대상으로 꺼내는 것 불가!
하한 제한을 하면 셋팅은 가능하지만, 꺼내는 것은 불가능하다.
class BoxcontentsMover {
// from에 저장된 내용물을 to로 이동
public static void moveBox(Box<? super Toy>to, Box<? extends Toy> from){
to.set(from.get());
}
}
// <? super Toy> : 하한 제한
// <? extends Toy> : 상한 제한