본문 바로가기

Java

[Java] Generic을 사용 할 때 가끔 Generic Type의 instance를 만들고 싶다.

Collection 같은 경우 generic type을 넣고 빼는 정도의 저장소로써 사용을 해서
그런 일이 없는데..
가끔 Generic Type의 instance를 동적으로
가져오고 싶을 때가 있다...

얼마전에 enum 을 사용한 mapper에 대해서 살짝 쓴적이 있는데..
(http://devyongsik.tistory.com/288)
이 짓을 하기 위해서는 List<String[]> 형의 데이터를  
getter 메서드를 가지고 있는 T type을 사용한 List<T> 형으로
바꿔주어야 했다.

솔루션에서 List<String[]> type으로 결과를 받아서
for문 돌려주면서 만들면 되기는 하는데..
필요한 곳에서 사용 할 수 있는 converter를 만들고 싶었다.


로 해결 되면 좋겠지만..

문제는 이 generic type의 T가
생성자 파라메터로 String[] 형을 가지며
instance로 생성되어야 한다는 것...

예를 들면 이런식인데..


그러면..바꾸고자 하는 type T는 어떤 모양인가..


경우에 따라서 두개의 domain class가 각각 사용된다.

generic type이 컴파일 된 코드에서는 모두 raw 타입으로 변경된다는 것을 생각해보면
T t = new T();
이런게 당연히 될리가 없고 ㅋㅋ

해서 찾아낸 방법이 아래와 같다..
어쩔 수 없이 ListDomain.class와 ImageDomain.class 를 Converter가 넘겨받아
reflect를 사용하여 instance를 생성하도록 하는 것.

일단 생성자에 들어가는 파라메터를 알고 있기 때문에
Converter에서는 큰 문제가 없겠다 싶었다.


일단 동작은 잘 하는데..

사실 generic을 사용 했지만
실제로 들어 갈 수 있는 타입은 딱 2가지 뿐이고..
그것도 생성자의 파라메터가 String[] 형을 가지고 있어야 한다.

이런거면 interface를 만들어서 그것을 상속한 generic type을 사용하는 것이
더 가독성도 좋고, 직관적일 것 같긴 한데..
레거시가 너무 깊게 박혀 있어서.. 그렇게까지는 건드리기가 쉽지 않네...

아무튼.. generic type을 instance화 하는 방법에 대해서는..
관련된 내용이 여기저기 많았다.

http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java
http://www.velocityreviews.com/forums/t593591-how-to-create-an-instance-of-type-t.html