퀴즈.. 자바 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]