-
매개변수화 타입(예:
List<String>
)을 받는 정적 유틸리티 메서드는 보통 제네릭이다.- 예)
Collections
의binarySearch
,sort
등
- 예)
-
제네릭을 사용하지 않는, 문제가 있는 메서드 (컴파일은 되지만 경고 발생)
public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; }
-
개선된 버전(제네릭 메서드 사용)
public static <E> Set<E> union(Set<E> s1, Set<E> s2) { Set<E> result = new HashSet<>(s1); result.addAll(s2); return result; }
- 타입 매개변수 목록(
<E>
): 메서드의 제한자와 반환 타입 사이에 위치 E
,T
의 차이는?E
는 리스트, 컬렉션 등의 원소(Element)에 사용,T
는 Type에 사용 [출처]- 한정적 와일드카드 타입(아이템 31)을 사용하면 더 유연하게 개선 가능
- 타입 매개변수 목록(
-
제네릭은 런타임에 타입 정보가 소거된다.
-
따라서 요청한 타입 매개변수에 맞게 타입을 바꿔 주는 정적 팩터리를 만들어야 한다.
-
예시: 항등함수 메서드
private static UnaryOperator<Object> IDENTITY_FN = (t) -> t; @SuppressWarnings("unchecked") // 경고 무시 public static <T> UnaryOperator<T> identityFunction() { return (UnaryOperator<T>) IDENTITY_FN; }
UnaryOperator<Object>
는UnaryOperator<T>
가 아니기 때문에 경고 발생함- 그대로 반환하기 때문에 경고를 숨겨도 안심할 수 있음
-
재귀적 타입 한정:
<T extends Comparable<T>>
-
주로
Comparable
인터페이스와 함께 쓰인다. -
예시
public static <E extends Comparable<E>> E max(Collection<E> c);
- 재귀적 타입 한정을 이용해 상호 비교할 수 있음을 표현했다.