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