이 글은 이것이 자바다를 참고하여 작성되었습니다.
class<T>, interface<T>)
- 제네릭 타입 : 타입을 파라미터로 가지는 클래스와 인터페이스.
public class 클래스명<T> {...} public interface 인터페이스명<T> {...}
(<T,R> R method(T t))
- 제네릭 메소드 : 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드.
public <타입파라미터,...> 리턴타입 메소드명(매개변수,...) {...}- 리턴 타입 앞에 <> 기호를 추가하고 타입 파라미터를 기술한 다음, 리턴 타입과 매개 타입으로 타입 파라미터를 사용하면 된다.
제네릭 메소드를 호출하는 방법
리턴타입 변수 = <구체적 타입> 메소드명(매개값);
// 명시적으로 구체적 타입을 지정리턴타입 변수 = 메소드명(매개값);
// 매개값을 보고 구체적 타입을 추정
public (T extends 상위타입) 리턴타입 메소드(매개변수,...){...}
- 상위타입은 클래스뿐만 아니라 인터페이스도 가능하다.
- 인터페이스라고 해서 implements를 사용하지 않는다.
- 타입 파라미터에 지정되는 구체적인 타입은 상위 타입이거나 상위 타입의 하위 또는 구현 클래스만 가능하다.
- 메소드의 중괄호 {} 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버(필드, 메소드)로 제한된다. 하위 타입에만 있는 필드와 메소드는 사용할 수 없다.
코드에서 ?를 일반적으로 와일드카드(wildcard)라고 부른다.
- 제네릭타입<?> : Unbounded Wildcards (제한 없음)
- 제네릭타입<? extends 상위타입>
: Upper Bounded Wildcards (상위 클래스 제한)- 제네릭타입<? super 하위타입>
: Lower Bounded Wildcards (하위 클래스 제한)
public class ChildProduct<T,M,C> extends Product<T,M>{...}
- 자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있다.
- 제네릭 인터페이스를 구현한 클래스도 제네릭 타입이 된다.