타입 안전 이종 컨테이너 예시 코드
// 타입 안전 이종 컨테이너 클래스
public class TypeSafeHeterogeneousContainer {
private Map<Class<?>, Object> container = new HashMap<>();
// 컨테이너에 객체 추가
public <T> void put(Class<T> clazz, T object) {
container.put(clazz, object);
}
// 컨테이너에서 객체 가져오기
public <T> T get(Class<T> clazz) {
return clazz.cast(container.get(clazz));
}
}
// 예시 코드 사용법
public static void main(String[] args) {
TypeSafeHeterogeneousContainer container = new TypeSafeHeterogeneousContainer();
// 컨테이너에 String 객체 추가
container.put(String.class, "Hello, World!");
// 컨테이너에서 String 객체 가져오기
String message = container.get(String.class);
System.out.println(message);
}
이 코드는 타입 안전 이종 컨테이너를 구현한 예시입니다. 이 컨테이너는 다른 타입의 객체를 저장하고 가져올 수 있으며, 컴파일 타임에 타입 안전성을 보장합니다. 이를 통해 다양한 타입의 객체를 관리할 때 유용하게 사용할 수 있습니다.<AI>
위와 같이 클래스의 타입을 키로 사용하여 컨테이너 자체는 타입에서 안전하게 사용할 수 있다.
그러나, 다음과 같은 경우를 생각해보아야 한다.
키로 Class<T> 를 기대했으나 로 타입ㅇ으로 값을 넘기는 경우 put 에서는 문제가 없으나 get 을 할 경우 ClassCastException 을 던질 것이다. - 물론 비검사 경고가 뜬다.
따라서 put 시점에 키에 맞게 값을 cast 하면 컨테이너 내에 들어가 있는 원소들의 타입 안전성을 보장할 수 있다.
실체화 불가 타입을 키로 사용할 수 없다.
List<String> 을 Class<T> type 으로 받으면 List.class 라는 Class<List> 가 들어가게 되어 의도와 다르게 동작하게 될 것이다.
슈퍼 타입 토큰
을 사용하여 실체화 불가 타입의 정확한 타입 정보를 얻어 안전하게 사용할 수 있는 방법이 존재함
참고.
타입 토큰: 컴파일타임 타입 정보와 런타임 타입 정보를 알 수 있게 해주는 class 리터럴
슈퍼 타입 토큰: 실체화 불가 타입을 상위 클래스에 정의하고 해당 클래스를 상속받아 상위 클래스의 클래스 정보를 활용하여 실체화 불가 타입의 타입 정보도 정확하게 알아내는 방식, 추가 내용 https://www.inforum.me/memos/820