我对泛型有点蹩脚,但我想知道,对于下面的课程:
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
部分)
答案 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()应该做的伎俩(假设值永远不为空!)