Generics은 컴파일 시간에 더 많은 버그를 감지할 수 있어 코드의 안정성을 추가해준다. 클래스, 인터페이스 및 메서드를 정의할 때 타입이 매개변수가 된다.
클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.
public class Student<T> {
static T getName(T name) {
return name;
}
}
제네릭 메소드로 만들면 static이 가능하다. -> T가 지역변수로 바뀐다.
public class Student<T> {
static <T> T getOneStudent(T id) {
return id;
}
}
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<>();
class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정가능
// Logic
}
interface Eatable {}
class FruitBox<T extends Eatable> { ... }
❗ Integer가 Number이 서브클래스라도 Box<Integer>가 Box<Number>의 서브 타입은 아니다.
-> Box<Integer>와 Box<Number> 공통 부모는 Object이다.