2013-02-28 5 views
1

Java에서 클래스 형식을 지정하는 인수를 요구하지 않고 제네릭 메서드 내에서 제네릭 형식을 사용하는 방법이 있는지 궁금합니다. 내가 대안으로이 싶습니다형식 인수가없는 일반 메서드

public <T> T doSomethingGeneric(Class<T> type, int a) { 
    return (T) doSomethingElse(type, a); 
} 

:

public <T> T doSomethingGeneric(int a) { 
    return (T) doSomethingElse(/* some magic with T here */, a); 
} 

배경 : 저는 최대 절전 모드와 유틸리티 방법을 쓰고 있어요 여기에 그것을하는 일반적인 방법이다. 다음은 실제로 수행하려고 시도하는 예제이며,이 문제에 어떻게 적용되는지 추측 할 수 있습니다.

public static <M extends Model> M get(Class<M> type, Serializable id) { 
    Session session = newSession(); 
    Transaction t = session.beginTransaction(); 
    Object model = null; 
    try { 
     model = session.get(type, id); 
     t.commit(); 
    } catch (HibernateException ex) { 
     t.rollback(); 
     throw ex; 
    } 
    return (M) model; 
} 

이것이 가능합니까? 그렇다면, 어떻게 완료됩니까? 감사!

+1

호기심 때문에, 왜''()'메소드를 쓰고 ['EntityManager']를 쓰지 않는가? (http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager. HTML)? –

+0

나는 Hibernate를 처음 접했고 EntityManager가 존재한다는 것을 모르기 때문에. 팁 고마워. :) –

+0

이 경우 최소한 Java EE 자습서의 관련 부분은 생략하는 것이 좋습니다. http://docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html –

답변

4

런타임시 Class<T>doSomethingElse()으로 전달 하시겠습니까? No, that is not possible.

doSomethingElseClass<T>이 필요한 이유를 설명하면 해결 방법을 제안 할 수 있습니다.

+0

유틸리티 메소드를 작성하고 있습니다. 최대 절전 모드. 다음은 내가 실제로하려고하는 일의 예입니다.이 문제에 어떻게 적용되는지 추측 할 수 있습니다. https://gist.github.com/blakeman8192/de57273f472ceaf1b7d8 –

+1

네, 불가능합니다. 그래서'Session # get()'은 먼저 Class 을 필요로합니다. –

2

doSomethingGeneric 코드는 C++에서 템플릿의 인스턴스화와 달리 한 번만 컴파일됩니다. 유형 T은 과정에서 ~ Object을 지운 입니다.

또한 (T)은 확인되지 않은 다운 캐스트로 플래그 지정됩니다.

관련 문제