자바에서 Generic 타입 객체 만들기 (T 타입 객체 만들기)
퀴즈.. 자바 Generic에서 타입으로 넘긴 T의 객체를 만들 수 있을까...정답은 "만들 수 있다." 인데 전 오답을 말했네요. 크헉;; 예전에 포스팅도 하고 코딩까지 해놨으면서 이런 실수를!!
무슨 문제냐면..
[java]
public class Generic<T> {
protected T objectT;
public Generic() {
//TODO T 타입 객체를 objectT에 할당하기
}
}
[/java]
[java]
public class Book {}
[/java]
[java]
public class BookGeneric extends Generic<Book>{}
[/java]
이때 다음 테스트가 돌아가야 됩니다.
[java]
public class GenericTest {
@Test public void typeInfer(){
BookGeneric bookGeneric = new BookGeneric();
assertNotNull(bookGeneric.objectT);
}
}
[/java]
충분히 만들 수 있습니다. 요렇게 하면 됩니다. 저도 어떤 외국 블로거에서 봤던 코드인데 회사 플젝에서도 써먹고 봄싹 플젝에서도 써먹고 있습니다. 물론 전 그냥 타입만 필요해서 Class<T> classT 추론하는데까지만 쓰고 객체를 만들 일은 없어서 newInstance() 까지 호출한적은 거의 없지만요..
[java]
public class Generic<T> {
protected Class<T> classT;
protected T objectT;
@SuppressWarnings("unchecked")
public Generic() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
Type type = genericSuperclass.getActualTypeArguments()[0];
if (type instanceof ParameterizedType) {
this.classT = (Class) ((ParameterizedType) type).getRawType();
} else {
this.classT = (Class) type;
}
try {
this.objectT = classT.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
[/java]