是否可以获得泛型参数的类?

时间:2010-07-01 09:17:41

标签: java generics ormlite

我对泛型有点蹩脚,但我想知道,对于下面的课程:

static class SomeClass<T> {
 private T value;

 public SomeClass(T value) {
  T.class?
  this.value = value;
 }

 public T getValue() {
  return value;
 }
}

如果要求举例: SomeClass<String> stringer = new SomeClass<String>("Hello"); 是否有可能在构造函数中获得String.class(或任何T)?

好的,等一下,我要解释一下我要解决的问题

实际问题是我正在使用OrmLite而且我有很多DAO对象,比如这个:

public class PostDAO extends BaseJdbcDao<Post, String> {
    public PostDAO(DatabaseType databaseType) {
        super(databaseType, Post.class);
    }
}

对于Domain,它是:

public class DomainDAO extends BaseJdbcDao<Domain, String> {
 public DomainDAO(DatabaseType databaseType) {
  super(databaseType, Domain.class);
 }
}

等等。我想参数化这些,所以我只能有一个:

public class DAO<K, V> extends BaseJdbcDao<K, V> {
 public DAO(DatabaseType databaseType) {
  super(databaseType, (WHAT HERE?));
 }
}

但我被困在what here部分)

3 个答案:

答案 0 :(得分:1)

怎么样:

public class DAO<K, V> extends BaseJdbcDao<K, V> {
 public DAO(DatabaseType databaseType, Class databaseClass) {
  super(databaseType, databaseClass);
 }
}

答案 1 :(得分:1)

@ pakore的答案很好,但我想补充一点,你不来定义每个类的DAO对象。我在ORMLite文档中推荐它,但它应该是一种方便,而不是痛苦。

您可以使用BaseJdbcDao作为匿名类来执行以下操作:

BaseJdbcDao<Post, String> postDao =
    new BaseJdbcDao<Post, String>(databaseType, Post.class) {
    };
postDao.setDataSource(dataSource);
postDao.initialize();

我在ORMLite junit测试中做了很多。可能更好的是有一个像下面这样的实用方法。我刚刚将它添加到了BaseJdbcDao类中,该类将在2.7版本中。

public static <T, ID> Dao<T, ID> createDao(DatabaseType databaseType,
    DataSource dataSource, Class<T> clazz) throws SQLException {
    BaseJdbcDao<T, ID> dao = new BaseJdbcDao<T, ID>(databaseType, clazz) {
    };
    dao.setDataSource(dataSource);
    dao.initialize();
    return dao;
}

答案 2 :(得分:-1)

value.getClass()应该做的伎俩(假设值永远不为空!)