자바의 정석을 통해 공부한 내용을 요약하였습니다
class FruitBox<T extends Fruit>{
ArrayList<T> list = new ArrayList<T>(); // Fruit의 타입만 자손으로 지정 가능
....
}
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>;
fruitBox.add(new Apple());
fruitBox.add(new Grape());
interface Eatable {}
class FruitBox<T extends Eatable> {...}
class FruitBox<T extends Fruit & Eatable> {...} // 클래스의 자손이면서 인터페이스도 구현해야한다면 &를 사용하여 연결한다.
class Juicer {
static Juice makeJuice(FruitBox<Fruit> box) { // Fruit으로 지정
String tmp = "";
for(Fruit f : box.getList())
tmp += f + " ";
return new Juice(tmp);
}
}
static Juice makeJuice(FruitBox<Fruit> box) {
String tmp = "";
for(Fruit f : box.getList())
tmp += f + " ";
return new Juice(tmp);
}
static Juice makeJuice(FruitBox<Apple> box) {
String tmp = "";
for(Fruit f : box.getList())
tmp += f + " ";
return new Juice(tmp);
}
< ? 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);
}
static <T> void sort(List<T> list, Comparator<? super T> c)
static <T extends Fruit> Juice makeJuice(FruitBox<T> box) {
String tmp = "";
for(Fruit f : box.getList())
tmp += f + " ";
return new Juice(tmp);
}
public static void printAll(ArrayList<? extends Product> list, ArrayList<? extends Product> list2) {
for(Unit u : list) {
System.out.println(u);
}
}
public static <T extends Product> void printAll(ArrayList<T> list, ArrayList<T> list2) {
for(Unit u : list) {
System.out.println(u);
}
}
Box box = null;
Box<Object> objBox = null;
box = (Box)objBox; // OK, 지네릭 타입 -> 원시타입 , 경고 발생
objBox = (Box<Object>)box; // OK, 원시타입 -> 지네릭 타입, 경고 발생
Box<? extends Fruit> wBox = new Box<Apple>();
class Box<T extends Fruit>{
void add(T t) {
....
}
}
👇
class Box{
void add(Fruit t) {
....
}
}
T get(int i) {
return list.get(i);
}
👇
Fruit get(int i) {
return (Fruit)list.get(i);
}
static Juice makeJuice(FruitBox<? extends Fruit> box) {
String tmp = "";
for(Fruit f : box.getList())
tmp += f + " ";
return new Juice(tmp);
}
👇
static Juice makeJuice(FruitBox box) {
String tmp = "";
Iterator it = box.getList().iterator();
while(it.hasNext()){
tmp += (Fruit)it.next() + " ";
}
return new Juice(tmp);
}