요약
① 제네릭 클래스의 static 멤버에 타입변수를 활용할 수 없다(∵정적 바인딩).
② 제네릭 타입을 선언한 메서드는 static 멤버가 될 수 있다.
클래스가 로드될 때 정적 제네릭 메서드도 메모리에 로드되지만, 타입 매개변수는 구체적 타입으로 결정되지 않다가, 호출될 때 전달된 인수를 기반으로 타입이 결정되기 때문이다.
public static void example(T generic) { /*...*/ } // error
public static <T> T getID(T id) { return (T)id; } // correct
③ 객체 / 배열 생성 시 타입변수를 사용할 수 없다(선언 O | 생성 즉 new 연산자 뒤 X).
public class GenericArray<T> {
public GenericArray(int capacity) {
elements = (T[])(new Object[capacity]);
// elements = new T[capacity]; X!!
}
}
④ 타입변수는 instanceof 연산자의 피연산자가 될 수 없다.
⑤ 제네릭 클래스의 타입 매개변수 T와 제네릭 클래스 내부에 선언된 제네릭 메서드의 타입 매개변수 T가 있다고 가정하였을 때, 이 둘은 타입 문자만 같은 것일 뿐, 사실상 서로 다른 별개의 타입 매개변수다.
⑥ 타입변수에 대입된 제네릭 타입과 생성자에 대입된 매개변수화된 타입은 일치해야 하는데, 이는 제네릭 타입 간의 다형성이 허용되지 않기 때문이다.
GenericArray<Object> obj = new GenericArray<String>(); // error
// 제네릭 타입 변수의 구체적 타입이 Products의 자손타입으로 제한된다.
class ProductsList<T extends Products>{}
class Calculate<T extends Number>{}
public <T extends Animal> T animal(T animal){}
extends 키워드를 이용하는 것이다.extends를 사용한다.<T extends A & B>처럼 &기호로 연결한다.