1

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

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部分)

4

3 回答 3

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;
}
于 2010-07-08T15:49:41.437 回答
1

关于什么:

public class DAO<K, V> extends BaseJdbcDao<K, V> {
 public DAO(DatabaseType databaseType, Class databaseClass) {
  super(databaseType, databaseClass);
 }
}
于 2010-07-01T10:29:58.050 回答
-1

value.getClass() 应该可以解决问题(假设 value 永远不会为空!)

于 2010-07-01T09:19:23.573 回答