컴파일 단계에서 컬렉션과 API 타입 안전성을 확보합니다.
제네릭은 클래스와 메서드가 다룰 타입을 매개변수화합니다. List<String>은 String만 넣을 수 있어 꺼낼 때 cast가 필요하지 않습니다.
Box<String> box = new Box<>(...)에서 오른쪽 다이아몬드는 왼쪽 선언을 보고 T를 String으로 추론하므로 box.get()은 cast 없이 String을 돌려줍니다. first(10, 20)은 인수만 보고 T를 Integer로 추론하고 두 정수를 Integer로 포장해 넘겨 왼쪽 값 10을 출력합니다. 정수와 문자열처럼 타입이 다른 두 인수를 넘겨도 T가 둘의 공통 상위 타입으로 추론되어 컴파일은 통과합니다.
타입 소거로 대부분의 제네릭 타입 정보는 런타임에 사라집니다. 기본형은 타입 인수로 쓸 수 없어 래퍼 타입을 사용합니다.
PECS 원칙에 따라 값을 생산하는 매개변수는 ? extends T, 소비하는 매개변수는 ? super T를 고려합니다.
List<Object>는 List<String>의 상위 타입이 아닙니다. 제네릭은 기본적으로 invariant입니다.
직접 바꿔보세요두 값을 바꾸는 제네릭 메서드를 작성하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.