타입을 파라미터화해서 컴파일 시에 구체적 타입 결정되도록 하는 것으로 컬렉션, 람다식, 스트림, NIO 에서 사용됨
컴파일 시 강한 타입 체크 가능하고, 타입 변환을 제거할 수 있음
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0);
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0);
타입을 파라미터로 가지는 클레스와 인터페이스
public class CLASSNAME <T> {...}
public interface INTERFACENAME <T> {...}
사용 예시
public class Box<T> {
private T t;
public T get() {return t;}
public void set(T t) {this.t = t;}
}
Box<String> box = new Box<String>();
box.set("hello");
String str = box.get();
Box<Integer> box = new Box<Integer>();
box.set(5);
int value = box.get();
두 개 이상의 타입 파라미터 사용 가능
class<K, V, ...> {...}
interface<K, V, ...> {...}
매개변수 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드
public <T, ...> RETURNTYPE METHODNAME(parameter,...){...}
타입 파라미터에 지정되는 구체적인 타입을 제한
public <T extends Parent> returnType method(parameter,...) {...}
주의할 점
- 메소드의 중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버(필드, 메소드)로 제한하여 하위 타입에만 있는 필드와 메소드는 사용 불가능
제네릭 타입을 매개변수나 리턴 타입으로 사용할 때 파라미터 제한할 목적으로 사용됨
public static void registerCourse(Course<?> course)
public static void registerCourse(Course<? extends Student> course)
public static void registerCourse<Course<? super Worker> course)
(상위)A-B-C-D-E(하위) 인 경우
<? extends C>
: C, D, E 만 위치 가능
<? super C>
: A, B, C 만 위치 가능
타입 파라미터는 자식 클래스에도 기술해야하며 추가적인 타입 파라미터 가질 수 있음
public class ChildProduct<T,M,C> extends Product<T, M> {...}
타입 파라미터는 구현 클래스에도 기술해야함
public class StorageImpl<T> implements Storage<T> {...}