Item 33. Type Safe Heterogeneous Container
νμ
μμ μ΄μ’
컨ν
μ΄λ(type safe heterogeneous container)
class Favorites {
private final Map<Class<?>, Object> favorites = new HashMap<>();
// ν΄λμ€μ 리ν°λ΄ νμ
μ Classκ° μλ Class<T>λ‘ ννν μ μλ€.(= νμ
ν ν°)
public <T> void putFavorite(Class<T> type, T instance) {
// Class κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό λ§€ννμ¬ μ μ₯, ν€μ κ° μ¬μ΄μ νμ
κ΄κ³κ° μλ©Έλμ§λ§ λ
Όλ¦¬μ μΌλ‘λ 보μ₯λλ€.
favorites.put(Objects.requireNonNull(type), instance);
}
public <T> T getFavorite(Class<T> type) {
// favorites.get(type)λ‘ Class κ°μ²΄λ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό κ°μ Έμ¨ λ€, νμ
μΊμ€ν
νμ¬ λ°ν
// * cast λ©μλ: νλ³ν μ°μ°μμ λμ λ²μ μΌλ‘, νμ
μ μΈμ€ν΄μ€μΈμ§ νμΈν λ€ μΈμ€ν΄μ€λ₯Ό T νμ
μΌλ‘ λ°ν(μ€ν¨ μ ClassCastException λ°μ)
return type.cast(favorites.get(type));
}
}
class Main {
public static void main(String[] args) {
Favorites f = new Favorites();
f.putFavorite(String.class, "Java"); // String ν΄λμ€ νμ
-> Class<String>
f.putFavorite(Integer.class, 0xeee); // Integer ν΄λμ€ νμ
-> Class<Integer>
f.putFavorite(Class.class, Favorites.class); // Class ν΄λμ€ νμ
-> Class<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", favoriteString, favoriteInteger, favoriteClass.getName());
}
}νμ
μμ μ΄μ’
컨ν
μ΄λμ μ μ½ μ¬ν
1. μ
μμ μΈ ν΄λΌμ΄μΈνΈ
2. μ€μ²΄ν λΆκ° νμ
μ¬μ© λΆκ°
νμ μ νμ
ν ν°(bounded type token)
Last updated