2010-06-03 6 views
2

다음 클래스가 있으므로 생성자에서 유형을 가져와야합니다. 어떻게해야합니까?Java generics를 사용하여 클래스 이름에서 유형 가져 오기

public abstract class MyClass<T> { 
    public MyClass() 
    { 
     // I need T type here ... 
    } 
} 

편집 : 다른 DAO를 가지고 있기 때문에,

public abstract class Dao<T> { 
    public void save(GoogleAppEngineEntity entity) 
    { 
     // save entity to datastore here 
    } 

    public GoogleAppEngineEntity getEntityById(Long id) 
    { 
     // return entity of class T, how can I do that ?? 
    } 
} 

내가하고 싶은 것은이 클래스가 다른 모든 DAO를 확장 한하는 것입니다 :

여기

내가 무엇을 달성하고자하는 구체적인 예이다 그 daos와 관련이 있고 일반적 일 수없는 몇 가지 쿼리가 있지만,이 간단한 쿼리는 일반적으로 모든 DAO 인터페이스/구현에서 사용할 수 있어야합니다 ...

+0

당신이 무엇을하고 싶은가에 따라 다릅니다. T를 인스턴스화 하시겠습니까? T로 다른 함수를 호출 하시겠습니까? – dplass

+0

나는 다른 모든 daos가 확장된다는 것을 알고 있으므로이 확장 된 DAO는 모든 daos에서 동일 할 수있는 기본적인 작업을 할 것이므로 결과 객체가 매핑되어야하는 클래스를 알 필요가있다. – newbie

+0

나는 이해하지만, 당신은 T를 가졌으므로 DAO의 다양한 다른 방법으로 "매핑"할 수 있습니다. 예 : T doSomething (T obj) – dplass

답변

4

우리는 내가이 잘못을 읽는 아니에요 경우이

public abstract BaseClass<T>{ 
protected Class<? extends T> clazz; 

    public BaseClass(Class<? extends T> theClass) 
    { 
     this.clazz = theClass; 
    } 
... 
} 

그리고 서브 클래스에서

,

public class SubClass extends BaseClass<Foo>{ 
    public SubClass(){ 
     super(Foo.class); 
    } 
} 
7

당신은 그것을 얻을 수 있습니다, 어느 정도까지는 ... 유용하지 않다면 확실하지 않습니다.

import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 

abstract class MyClass<T> { 
    public MyClass() {   
    Type genericSuperclass = this.getClass().getGenericSuperclass(); 
    if (genericSuperclass instanceof ParameterizedType) { 
     ParameterizedType pt = (ParameterizedType) genericSuperclass; 
     Type type = pt.getActualTypeArguments()[0]; 
     System.out.println(type); // prints class java.lang.String for FooClass 
    } 
    } 
} 

public class FooClass extends MyClass<String> { 
    public FooClass() { 
    super(); 
    } 
    public static void main(String[] args) { 
    new FooClass(); 
    } 
} 
+1

'public class ConcreteMyClass 가 MyClass 을 확장하는'new ConcreteMyClass ()'을 수행 한 경우 유형이 수정되지 않았기 때문에 "T"가 표시됩니다 . –

+0

Dao 가 트릭을 수행 할 수 있습니다. – dplass

0

그리고 단순히 생성자 매개 변수를 추가 할 수 없습니까?

public abstract class MyClass<T> { 
    public MyClass(Class<T> type) { 
    // do something with type? 
    } 
} 
0

, 당신은 단지

public <T> void save(T entity) 
를 원하지 않을 것이다 했어

public <T> T getEntityById(Long id) 

서명 방법은 무엇입니까?

관련 문제