우리가 생각하는 컨테이너는 어떤 다른 객체를 넣을 수 있는 또다른 객체를 생각할 수 있습니다. 가령 Set, Map, Optional 이런것들이 객체를 넣을 수 있는 컨테이너라고 할 수 있는데 우리가 여태까지 사용했던 제네릭을 사용하는 방식은 아래 Favorites클래스처럼 오로지 딱 한가지 타입만을 넣을 수 있는방식이었습니다.
package me.whiteship.chapter05.item33.type_token;
import java.util.List;
public class Favorites<T> {
private List<T> value;
public <T> T get(Class<T> clazz) {
return clazz.cast(this.map.get(clazz));
}
public static void main(String[] args) {
Favorites<String> names = new Favorites<>();
names.value.add("문자열")
}
}
하지만 위와 같이 하나의 타입으로만 요소를 넣지 않고 여러가지 타입을 저장하고 싶을때 아래와 같이 Map을 참조해서 구현할 수 있습니다.
package me.whiteship.chapter05.item33.type_token;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class Favorites {
private Map<Class<?>, Object> map = new HashMap<>();
public <T> void put(Class<T> clazz, T value) {
this.map.put(Objects.requireNonNull(clazz), clazz.cast(value));
}
public <T> T get(Class<T> clazz) {
return clazz.cast(this.map.get(clazz));
}
public static void main(String[] args) {
Favorites favorites = new Favorites();
favorites.put(String.class, "keesun");
favorites.put(Integer.class, 2);
// favorites.put(List<Integer>.class, List.of(1, 2, 3));
// favorites.put(List<String>.class, List.of("a", "b", "c"));
// List list = favorites.get(List.class);
// list.forEach(System.out::println);
}
}