제네릭 타입과 마찬가지로 클라이언트에서 입력 매개변수와 반환값을 명시적으로 형변환해야 하는 메소드보다 제네릭 메소드가 더 안전하며 사용하기도 쉽다.

 

알기 쉬운 예시로는 Collections의 알고리즘 메소드는 모두 제네릭이다.

 

우리는 앞선 Item 26에서 로타입을 사용하면 안되는 이유를 학습했다.

public static Set union(Set s1, Set s2) {
    Set result = new HashSet(s1);
    result.addAll(s2);
    return result;
}

위의 로 타입 메소드는 컴파일은 되지만 런타임시에 타입 에러가 발생한다.

위의 코드를 변환한 단순한 제네릭 메소드 타입을 보자

public static void main(String[] args){
    Set<String> guys = Set.of("톰", "딕", "해리");
    Set<String> stooges = Set.of("래리", "모에", "컬리");
    Set<String> aflCio = Union(guys, sootges);
}

합집합을 만드는 제네릭 메소드인데 경고없이 컴파일 되며 타입 안전하고 쓰기도 쉽다.

 

제네릭 싱글톤 팩토리

 

때때로 불변 객체를 사용할 때 타입을 유연하게 바꿔야 하는 상황이 발생하는데

요청한 타입 매개변수에 맞게 매번 그 객체의 타입을 바꿔주는 정적 팩토리를 제네릭 싱글톤 팩토리라 한다.

private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;

@SuppressWarnings("unchecked")
public static <T> UnararyOperator<T> identityFunction() {
    returnb (UnaryOperator<T>) IDENTITY_FN;
}

이렇게 하면 객체를 생성할때 Object 위치에 타입이 들어올때 마다 형변환을 알아서 해주게 된다.

 

string 배열을 만들어 UnaryOperator<String> 으로 사용하거나

Number 배열을 만들어 UnaryOperator<Number>의 형태처럼 사용 가능하다.

+ Recent posts