使用Java泛型从类名获取类型

时间:2010-06-03 20:57:00

标签: java generics

我有以下课程,我需要输入构造函数,我该怎么做?

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接口/实现...

4 个答案:

答案 0 :(得分: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 :(得分: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);
    }
}

答案 2 :(得分:0)

你不能简单地添加构造函数参数吗?

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

答案 3 :(得分:0)

如果我没有读错,你不会只想要

public <T> void save(T entity)

public <T> T getEntityById(Long id)

您的方法签名?