제한된 타입 파라미터
- Bounded Type Parameter
- Generic을 이용한 타입(문자)에 대해 구체적으로 타입을 제한할 경우에 사용함.
- <T extends 제한타입> => 제너릭타입의 상한 제한. 제한타입과 그 자손(타입)들만 가능
예시
1단계: Util 클래스 생성
Class Util2 {
public static <T extends Number> int compare(T t1, T t2) {
double v1 = t1.doubleValue();
double v2 = t2.doubleValue();
return Double.compare(v1, v2);
}
}
2단계: 제한된 타입 파라미터 사용 예시
public class T04_GenericMethod {
public static void main(String[] args) {
int result1 = Util2.compare(10, 20);
System.out.println(result1);
int result2 = Util2.compare(3.14, 3);
System.out.println(result2);
}
}
와일드카드 (Wildcard)
- 제너릭이 사용된 객체를 참조할 때 참조할 객체의 타입을 제한하기 위해 사용한다.
- < ? extends T > : 와일드 카드의 상한 제한. T와 그 자손들만 가능
- < ? super T > : 와일드 카드의 하한 제한. T와 그 조상들만 가능
- < ? > : 모든 타입이 가능 (= <? extends Object>)
예시
과일상자 담기
1단계: 과일 클래스와 사과, 포도 클래스
class Fruit {
private String name;
}
class Apple extends Fruit {
public Apple() {
super("사과");
}
}
class Grape extends Fruit {
public Grape() {
super("포도");
}
}
2단계: 과일상자 클래스
class FruitBox<T> {
private List<T> fruitList;
public FruitBox() {
fruitList = new ArrayList<>();
}
public List<T> getFruitList() {
return fruitList;
}
public void setFruitList(List<T> fruitList) {
this.fruitList = fruitList;
}
public void add(T fruit) {
fruitList.add(fruit);
}
}
3단계: 과일 쥬스 만드는 클래스
class Juicer {
static void makeJuice(FruitBox<? extends Fruit> box) {
String fruitStr = "";
int cnt = 0;
for (Fruit f : box.getFruitList()) {
if (cnt == 0) {
fruitStr += f;
} else {
fruitStr += "," + f;
}
cnt++;
}
System.out.println(fruitStr + " => 쥬스 완성!!!");
}
}
4단계: main()에서 실행
FruitBox<Fruit> fruitBox = new FruitBox<>();
FruitBox<Apple> appleBox = new FruitBox<>();
fruitBox.add(new Apple());
fruitBox.add(new Grape());
appleBox.add(new Apple());
appleBox.add(new Apple());
Juicer.makeJuice(fruitBox);
Juicer.makeJuice(appleBox);
과일상자 담기2
1단계: 과일상자2 클래스 생성
class FruitBox2 <T extends Fruit> {
List<T> itemList = new ArrayList<>();
public void addItem(T item) {
this.itemList.add(item);
}
public List<T> getItemList() {
return itemList;
}
public void setItemList(List<T> itemList) {
this.itemList = itemList;
}
}
2단계: main() 에서 객체생성 해보기
FruitBox2<?> fruitBox1 = new FruitBox2();
FruitBox2<?> fruitBox2 = new FruitBox2<>();
FruitBox2<?> fruitBox3 = new FruitBox2<Fruit>();
FruitBox2<? extends Fruit> fruitBox4 = new FruitBox2<Apple>();
수강 코스 등록예시는 T07 참고