자바의 정석
class Box<T> {
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
Box<T>
: 제너릭 클래스, T의 Box
또는 T Box
라고 읽는다.
T
: 타입 변수 또는 타입 매개 변수. (T는 타입 문자)
Box
: 원시 타입
Box<Apple>.item
과 Box<Grape>.item
이 다른 것이어서는 안된다.
class FruitBox<T extends Fruit> {
ArrayList<T> list = new ArrayList<T>();
}
interface Eatable {}
class FruitBox<T extends Eatable> { ... }
class FruitBox< T extends Fruit & Eatable> { ... }
< ? extends T > # 와일드 카드의 상한 제한. T와 그 자손만 가능
< ? super T > # 와일드 카드의 하한 제한. T와 그 조상만 가능
< ? > # 제한 없음. 모든 타입이 가능 < ? extends Object > 와 동일
아래의 경우 Fruit 자손 타입 아무 것이나 와도됨
static 메서드 같은 경우 사용(컴파일 에러 발생)
static Juice makeJuice(FruitBox< ? extends Fruit > box ) {
}
매서드 선언 부에 제네릭 타입이 선언된 메서드
제너릭 타입의 선언 위치는 반환 타입의 바로 옆
class FruitBox<T> {
static <T extends Fruit> Juice makeJucie(FruitBox<T> box) {
..
return new Juice(tmp);
}
}