2010-06-03 650 views
2

我有以下類,我需要在構造函數中獲得類型,我該怎麼做?使用Java泛型從類名獲取類型

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

編輯:

這裏是我想達到什麼具體的例子:

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,因爲其他的DAO有一些查詢是特定於這些daos並且不能通用,但是這些簡單的查詢應該通常可用於所有的DAO接口/實現...

+0

取決於你想用它做什麼。你想實例化一個T?你想用T調用另一個函數嗎? – dplass 2010-06-03 21:21:22

+0

我有道,所有其他daos擴展,所以這個擴展道將有一些基本的操作,可以相同的所有daos,所以我需要知道類的結果對象應映射 – newbie 2010-06-03 21:30:40

+0

我不知道我明白,但自你有T,你可以用你的DAO中的其他方法「映射」它,例如, T doSomething(T obj) – dplass 2010-06-04 13:06:25

回答

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

需要注意的是,如果你沒有'新ConcreteMyClass ()',其中'公共類ConcreteMyClass 擴展MyClass的'你只是得到「T」,因爲該類型不是物化。 – 2010-06-04 14:29:19

+0

Dao 可能會訣竅。 – dplass 2010-06-04 20:30:25

0

而你不能簡單地添加一個構造參數?

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

如果我不讀這個毛病,你不會只想

public <T> void save(T entity) 

and

public <T> T getEntityById(Long id) 

您的方法簽名?