2012-08-20 4 views
1

나는 일반적인 인수를 전달하는 메서드가 있습니다. 하나의 필수 메서드를 실행하려면 같은 클래스 인스턴스가 필요합니다. 나는 그것을 어떻게 얻을 수 있는가? 사용하고있는 해결 방법이 있지만 어떻게 Class 인스턴스를 얻을 수 있는지 알고 싶습니다.Java에서 제네릭 형식의 클래스 인스턴스 가져 오기

내가 사용하고 코드 조각은 다음과 같습니다

public <T> T readModelWithId(Class<T> c, Serializable pk) { 
    // Some code here. 
    T t = (T)session.get(c, pk); 
    // Some code here. 
    return t; 
} 

문제는 그것이 일반적인 유형입니다 반환 형식 T와 동일 나는이 방법에 Class 인스턴스를 전달하지 않는다는 것입니다 .

답변

2

Java는 "유형 삭제"를 사용하여 Generics를 구현하므로 수행 할 수 없습니다. 당신이 일반적인 DAO를하고있는 것처럼

http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

보인다.

http://www.matthews-grout.co.uk/2012/01/my-generic-hibernate-dao.html

+0

나는 동의하지만 해결 방법을 찾고 있는데 .. – pratikabu

+0

내 대답을 일부 변경했습니다. – Dan

+1

구현을 보았지만 HibernateDaoImpl 클래스를 인스턴스화하는 동안'Class '인스턴스를 전달하는 것을 볼 수 있습니다. 차례 차례로 같은 것입니다. 그러나 나는 당신이 구현을 관리하는 방식을 좋아합니다. :) – pratikabu

-1

제네릭은 컴파일 타임 유형 안전을 위해 더 많이 사용됩니다. 컴파일러가 누락 된 캐스트에 대해 불평하지 않도록 클래스 인스턴스가 필요합니다. 양자 택일로 제네릭을 버리고 결과를 캐스팅 할 수 있습니다.

+0

동의하지만 .. 그것은 나에게 다른 반환 형식 불필요한 같은 방법을 많이 절약으로 일반적인 사용했습니다 – pratikabu

+1

무엇 "컴파일러 캐스팅 누락에 대해 불평을하지 않도록 당신이 클래스 인스턴스가 필요"가? 아니요. 'session.get()'에 전달할 클래스 인스턴스가 필요합니다. 캐스트 할 클래스 인스턴스가 필요하지 않습니다. – newacct

3

그 방법 내에서 T.class과 같은 것을 얻을 수있는 방법이 없으므로 세션에서 모델 객체를 가져 오기 위해 클래스 인수를 전달해야하므로 클래스 인수를 전달해야합니다.

또한이 기능은 약간의 추가 "유형 안전성"을 추가합니다. 호출자가 반환 형식을 인수로 지정하도록합니다. 따라서 반환 된 형식은 "호출자가 예상 할 수있는 모든 것"이 아닙니다.

+0

안녕하세요 @Costi, 전 당신의 진술에 동의합니다, 나는 여분의 여분의 물건 만 제거하고 싶습니다 .. iff 어떤 방법이든 .. :) – pratikabu

+1

불행히도, 방법은 없습니다. –

+0

아니요. 안돼. 런타임시 중복되지 않습니다. –

0

당신은 캐스트와 비 제네릭 할 수 없었다 제네릭 아무것도 할 수 없습니다 : 여기 비슷한 일을했습니다.

public Object readModelWithId(Class c, Serializable pk) { 
    // Some code here. 
    Object t = session.get(c, pk); 
    // Some code here. 
    return t; 
} 

지금 당신은 클래스의 인스턴스 인수 c 제거 할 수 같은 질문 : 코드의 비 일반 버전을 고려?

+0

하지만이 경우에는이 메서드가 호출 될 때마다 불필요한 형 변환이 관련됩니다. 네, 여기에 클래스 인스턴스를 전달해야합니다. – pratikabu

관련 문제