💡 타입 안전 이종 컨테이너 (Type Safe Heterogeneous Container) : 여러 다른 종류들로 이루어진 값을 저장하는 타입에 안전한 객체
Set<?>
, Map<?, ?>
등은 특정 Type만 저장할 수 있다.
Type이 String
일지 Integer
일 지 모를 때 사용한다.
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
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.cast(favorites.get(type));
}
}
public class Main {
public static void main(String[] args) {
Favorites favorites = new Favorites();
Favorites f = new Favorites();
f.putFavorite(String.class, "Java");
f.putFavorite(Integer.class, 0xcafebabe);
f.putFavorite(Class.class, Favorites.class);
String favoriteString = f.getFavorite(String.class);
int favoriteInteger = f.getFavorite(Integer.class);
Class<?> favoriteClass = f.getFavorite(Class.class);
System.out.printf("%s %x %s%n", favoriteString, favoriteInteger, favoriteClass.getName());
}
}
key
타입이 Class<T>
이기 때문에, 여러 타입의 Key를 담을 수 있다.Map
에 넣는 것이기 때문에 null
이 들어가면 안된다.Objects.requireNonNull(type)
cast
를 하지 않으면 T
가 아니라 Object
가 반환된다. (Map
의 value
타입이 Object
이기 때문~)ClassCastException
을 던진다.Class
객체를 타입으로 넘기면 타입안전성이 깨짐f.putFavorite((Class) Integer.class, "hi");
int x = f.getFavorite(Integer.class);
System.out.println("x = " + x);
f.putFavorite(List<Integer>.class, "hi");