raw 타입을 사용한 메소드
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
두개의 Set를 받아서 하나로 합친 후 반환하는 union 클래스가 있다. 제네릭 없이 raw타입만을 매개변수로 받고 raw 타입으로 반환하기 때문에, 서로 다른 타입 매개변수를 가지고있는 Set 객체라고해도 일단 하나로 합쳐진다. 그리고 반환된 Set는 Object 타입을 가지고 있다고 나오는데, 실제로 어떤 타입을 가지고 있는지는 알수가 없다. 즉 매우 위험한 코드이다.
Set<Integer> intSet = new HashSet<Integer>();
intSet.add(1);
Set<String> strSet = new HashSet<String>();
strSet.add("hello");
Set unionSet = union(intSet, strSet);
// unionSet에서 뽑은 객체가 어떤 타입인지 알 수 없다?!
unionSet.iterator().next();
제네릭 타입을 사용한 메소드
public static Set<T> union(Set<T> s1, Set<T> s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
union 메소드를 제네릭을 활용하여 동일 타입 파라미터를 가지고있는 Set 객체를 받아서 합치고 반환하도록 만들었다. 이제는 동일 타입 파라미터를 가지는 두 개의 Set 객체만을 받아서 합쳐진 Set에도 하나의 타입만이 들어있는것이 보장된다.
제네릭 타입을 사용한 메소드 항등함수
private static UnaryOperator<Object> FUNC = (t) -> t;
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> func(){
return (UnaryOperator<T>) FUNC;
}
// 타입에 맞는 FUNC 생성
UnaryOperator<String> strFunc = func();
UnaryOperator<Integer> intFunc = func();
항등함수란 자기자신을 반환하는 함수를 말한다. 위의 코드에서 FUNC로 선언된 항등함수가 있다. 이는 Object 타입을 받고 받관하는 항등함수 이지만 func() 메소드에서 제네릭을 활용하여 어떤 타입으로도 사용할 수 있도록 하였다.
재귀적 타입 한정
// 타입 파라미터 E는 Comparable<E>의 하위타입으로 제한되어있다.
// E를 제한하는 상위 타입에도 E가 있는데 이를 재귀적 타입 한정이라고 한다.
// 이를 통해 E는 자기자신과 비교 할수 있다는 것을 명시적으로 알 수 있다.
public static <E extends Comparable<E>> E max(Collection<E> c);
728x90