충분히 쌓여가는
와일드 카드 <?>, 지네릭 메서드 본문
와일드 카드 <?>
하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
타입이 일치하지 않아도 된다
ArrayList<? extends Product> list = new ArrayList<Tv>(); // OK
ArrayList<? extends Product> list = new ArrayList<Audio>(); // OK
ArrayList<Product> list = new ArrayList<Tv>(); // 에러, 대입된 타입 불일치
와일드 카드의 종류 3가지
<? extends T>: 와일드 카드의 상한제한, T와 그 자손들만 가능
<? super T>: 와일드 카드의 하한제한, T와 그 조상들만 가능
<?>: 제한 없음, 모든 타입이 가능, <? extends Object>와 동일
메서드의 매개변수에 와일드 카드를 사용
static Juice makeJuice(FruitBox<? extends Fruit> box) {
String tmp = "";
for(Fruit f : box.getList()) tmp += f + " ";
return new Juice(tmp);
}
Fruit와 Apple 둘 다 사용 가능하다
System.out.println(Juicer.makeJuice(new FruitBox<Furit>())); // Ok
System.out.println(Juicer.makeJuice(new FruitBox<Apple>())); // Ok
만약 extends가 아니라면
static Juice makeJuice(FruitBox<Fruit> box) {
String tmp = "";
for(Fruit f : box.getList()) tmp += f + " ";
return new Juice(tmp);
}
Fruit만 사용가능하다
System.out.println(Juicer.makeJuice(new FruitBox<Furit>())); // Ok
// System.out.println(Juicer.makeJuice(new FruitBox<Apple>())); // 에러
코드
import java.util.ArrayList;
class Fruit { public String toString() { return "Fruit";}}
class Apple extends Fruit { public String toString() { return "Apple";}}
class Grape extends Fruit { public String toString() { return "Grape";}}
class Juice {
String name;
Juice(String name) { this.name = name + "Juice"; }
public String toString() { return name; }
}
class Juicer {
static Juice makeJuice(FruitBox<? extends Fruit> box) { // Fruit와 그 자손 가능
String tmp = "";
for(Fruit f : box.getList())
tmp += f + " ";
return new Juice(tmp);
}
}
class WildCardTest {
public static void main(String[] args) {
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
fruitBox.add(new Apple());
fruitBox.add(new Grape());
appleBox.add(new Apple());
appleBox.add(new Apple());
System.out.println(Juicer.makeJuice(fruitBox));
System.out.println(Juicer.makeJuice(appleBox)); // 와일드 카드를 사용했기 때문에 가능
}
}
class FruitBox<T extends Fruit> extends Box<T> {}
class Box<T> {
ArrayList<T> list = new ArrayList<T>();
void add(T item) { list.add(item); }
T get(int i) { return list.get(i); }
ArrayList<T> getList() { return list; }
int size() { return list.size(); }
public String toString() { return list.toString();}
}
Apple Grape Juice
Apple Apple Juice
'Java > JAVA3' 카테고리의 다른 글
지네릭 형변환 (0) | 2023.07.29 |
---|---|
지네릭 메서드 (0) | 2023.07.28 |
제한된 지네릭 클래스, 지네릭스의 제약 (0) | 2023.07.27 |
지네릭스 용어, 지네릭 타입과 다형성 (0) | 2023.07.26 |
타입 변수 (0) | 2023.07.25 |