WildCard <?>
Generic Type의 안정성을 확보하기 위한 type argument
Wild Card는 Generic과 완전히 같은 Mechanism을 가진다.
Wild Card를 통해 Generic 사용을 제한함으로서 안전한 Generic사용을 구현함.
하나의 참조 변수로 대입된 타입이 다른 객체를 참조가 가능하다.
<? Extends T> | 와일들 카드의 상한 제한. T와 그 자손들만 가능 |
<? Super T> | 와일드 카드의 하한 제한. T와 그 조상들만 가능 |
<?> | 제한 없음, 모든 타입이 가능. <? extends Object>와 동일 |
public class smple {
FruitBox2<Fruit2> fruitBox = new FruitBox2<Fruit2>();
// Fruit2와 그 자손들을 다를 수 있다.
FruitBox2<? extends Fruit2> appleBox = new FruitBox2<Apple2>();
}
Type Argument의 이해
<> 사이에 ? 가 올 경우 (wildcard) 이는 어떤 데이터 타입이 와도 상관없다는 의미이다.
하지만 특정 데이터 타입이 올 경우 해당 데이터 타입으로 한정된다.
아래와 같이 peekBox()를 호출하면 좌측은 정상이나 우측은 에러이다.
이렇게 ERROR가 발생하는 이유는 Object는 String의 부모클래스지만 Box<Object>는 Box<String>의 부모클래스가 아니기 때문이다.
그러하여 기본적으로 Type Argument는 Type을 제한한다.
? 또한 Argument다.
Upper-Bounded WildCard (와일드카드의 상한 제한)
Box<? extends Number> box
?는 Number 또는 Number를 상속받는 클래스
상한제한을 통해 get()과 같은 method만 호출 하게 한다.
Lower-Bounded WildCard (와일드카드의 하한 제한)
Box<? super Integer> box
?는 Integer 또는 Integer가 상속하는 Class
하한제한을 통해 set()과 같은 Method만 호출 하게 한다.
<? extends class-name>
set 계열은 불가능하다.
get 계열은 가능하다.
<? super class-name>
get 계열은 불가능하다.
set 계열은 가능하다.
'JAVA' 카테고리의 다른 글
[Java] enum(열거형) (0) | 2022.08.03 |
---|---|
[Java] Generic Programming (0) | 2022.08.01 |
[Java] Collections Framework 예제 (0) | 2022.07.28 |
[Java] Collections Framework - Comparator & Comparable (0) | 2022.07.28 |
[Java] Collections Framework - Collections method (0) | 2022.07.26 |