ClassCastException
) 를 방지하고 컴파일 에러에서 해결 가능하게 도와준다.ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 컴파일 에러. Tv 외에 다른 타입은 저장 불가
ArrayList<Object> list = new ArrayList<Object>(); // 다양한 타입도 저장 가능
public class ArrayList<E> extends AbstractList<E> {
public boolean add(E o) {}
// 생략
}
// 타입 변수 E 대신에 실제 타입 Tv 를 대입
ArrayList<Tv> tvList = new ArrayList<Tv>();
ArrayList tvList = new ArrayList();
tvList.add(new Tv());
Tv t = (Tv)tvList.get(0);
// 형변환 필요 Object -> Tv
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(0);
// 형변환 불필요
💡
Box - 지네릭 클래스, T의 Box 또는 T Box 라고 읽는다.
T - 타입 변수 또는 타입 매개 변수 (T 는 타입 문자)
Box - 원시 타입 (raw type)
ArrayList<Tv> list = new ArrayList<Tv>(); // ✅ OK, 일치
ArrayList<Product> list = new ArrayList<Tv>(); // ❌에러, 불일치
List<Tv> list = new ArrayList<Tv>(); // ✅ OK, ArrayList 가 List 구현
List<Tv> list = new LinkedList<Tv>(); // ✅ OK, LinkedList 가 List 구현
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv());
list.add(new Audio());
,
(콤마) 를 구분자로 선언HashMap<String, Student>map = new HashMap<>();
extends
로 대입할 수 있는 타입을 제한extends
를 사용 (여러 인터페이스 &
로 구분)class FruitBox<T extends Fruit> { // Fruit 의 자손만 타입으로 지정 가능
ArrayList<T> list = new ArrayList<T>();
}
FruitBox<Apple> appleBox = new FruitBox<Apple>();
FruitBox<Toy> toyBox = new FruitBox<Toy>(); // ❌에러, Toy 는 Fruit 의 자손이 아니다.
ArrayList<? extends Product> list = new ArrayList<Tv>();
ArrayList<? extends Product> list = new ArrayList<Audio>();
ArrayList<Product> list = new ArrayList<Tv>(); // ❌에러, 대입된 타입 불일치
static Juice makeJuice(FruitBox<? extends Fruit> box) {
String tmp = "";
for(Fruit f : box.getList()) tmp += f + " ";
return new Juice(tmp);
}
makeJuice(new FruitBox<Fruit>())
makeJuice(new FruitBox<Apple>())
static <T> void sort(List<T> list, Comparator<? super T> c)
class FruitBox<T> { // 타입 문자 일치하지만 다른 타입 변수
static <T> void sort(){} // 타입 문자 일치하지만 다른 타입 변수
}
<Fruit>makeJuice();
<Apple>makeJuice();