Set, Map<K, V>와 같이 단일원소 컨테이너에 사용되는 제네릭에서 매개변수화되는 대상은 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다.
하지만 더 유연한 수단이 필요할 때가 있다. 예를 들면 데이터베이스의 행은 임의 개수의 열을 가질 수 있는데, 모두 열을 타입 안전하게 이용하면 좋을 것이다. 이를 위해 컨테이너 대신 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공할 수 있다. 이러한 설계 방식을 타입 안전 이종 컨테이너 패턴이라고 한다.
[타입 안전 이종 컨테이너 패턴]
public class Favorites {
public <T> void putFavorite(Class<T> type, T instance);
public <T> T getFavorite(Class<T> type);
}
public class Favorites {
private Map<Class<?>, Object> favorites = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), instance);
}
public <T> T getFavorite(Class<T> type) {
return type.cass(favorites.get(type));
}
}
Class.case() 메서드는 객체 참조를 Class객체가 가리키는 타입으로 동적 형변환한다.