2010-07-01 30 views
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部分)

+0

你为什么想要上课? – pakore 2010-07-01 09:21:57

+0

你不能'new SomeClass (“Hello”);'在'静态'类btw。 – pakore 2010-07-01 09:22:42

+0

@pakore:也许你不能,但我可以。 ;)认真:对我来说工作正常,为什么不呢? [派生类从通用T]的 – musiKk 2010-07-01 09:39:19

回答

1

什么:

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

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

+0

如果我没有价值,该怎么办? – htf 2010-07-01 09:30:54

+0

然后你不能。该信息仅在编译时可用。运行时只有'Object'。 – musiKk 2010-07-01 09:40:45

+0

我认为BaseJdbcDao具有类参数作为参数,因为您无法从类型参数获取类。 由于Dao本身并不是一个具体类,所以您也可以在其中添加类参数。 – tkr 2010-07-01 09:57:05

1

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

你总是可以做类似下面使用BaseJdbcDao作为一个匿名类:

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

我做了很多的ORMLite JUnit测试。可能会更好地使用如下的实用方法。我刚刚将它添加到将在2.7版本中的BaseJdbcDao类中。

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; 
} 
相关问题