2018-4-18 TIL 와일드카드 상,하한 제한
와일드카드의 상한과 하한의 제한 : Bounded Wildcards
public static void peekBox(Box<T> box) {
System.out.println(box);
}
-
Box
에서 T가 Number 또는 Number의 하위 클래스인 제네릭타입의 인스턴스만 전달되도록 제한을 할때, '상한 제한된 와일드카드'를 사용한다. -
Box<? extends Number> box : Box
인스턴스의 T는 Number 또는 이를 상속하는 하위클래스만이 가능하다.
package yoon;
public class UpperBoundedWildcard {
public static void main(String [] args) {
Box2<Integer> iBox = new Box2<>();
iBox.set(1234);
Box2<Double> dBox = new Box2<>();
dBox.set(10.009);
Unboxer.peekBox(iBox);
Unboxer.peekBox(dBox);
}
}
//result
12345
10.009
하한제한된 와일드카드
- Box<? super Integer> box 처럼 하한제한된 와일드카드 선언도 할 수 있다. Box
는 Integer 또는 Integer가 상속하는 클래스이어만한다.
public static void peekBox(Box<? super Integer> box) {
System.out.println(box);
}
- 위 메소드 인자로 전달될 수 있는 인스턴스의 타입 종류는 Box
, Box , Box
package yoon;
class Unboxer2 {
public static void peekBox(Box2<? super Integer> box) {
System.out.println(box);
}
}
public class LowerBoundedWildcard {
public static void main(String [] args) {
Box2<Integer> iBox = new Box2<Integer>();
iBox.set(5577);
Box2<Number> nBox = new Box2<Number>();
nBox.set(new Integer(9955));
Box2<Object> oBox = new Box2<Object>();
oBox.set("My Simple Instance");
Unboxer2.peekBox(iBox);
Unboxer2.peekBox(nBox);
Unboxer2.peekBox(oBox);
}
}
//result
5577
9955
My Simple Instance
상한제한의 목적
package yoon;
class Toy {
@Override
public String toString() {
return "I am a boy";
}
}
class BoxHandler {
public static void outBox(Box2<Toy> box) {
Toy t = box.get(); // 상자에 꺼내기
System.out.println(t);
}
public static void inBox(Box2<Toy> box, Toy n) {
box.set(n); // 상자에 넣기
}
}
public class BoundedWildcardBase {
public static void main(String [] args) {
Box2<Toy> box = new Box2<>();
BoxHandler.inBox(box, new Toy());
BoxHandler.outBox(box);
}
}
//result
I am a boy
Written on April 18, 2018