检索泛型类的.class属性

时间:2012-05-15 20:05:56

标签: java generics ektorp

我正在尝试使用构造函数(来自Ektorp库)扩展以下类:

public class CouchDbRepositorySupport<T extends CouchDbDocument> implements GenericRepository<T> {

...

protected CouchDbRepositorySupport(Class<T> type, CouchDbConnector db) {
...

}

这是我的实施:

public class OrderRepository extends CouchDbRepositorySupport<Order<MenuItem>> {

    public OrderRepository(CouchDbConnector db) {
        super(Order<MenuItem>.class, db);

问题在于Order<MenuItem>.class部分。 Java编译器告诉我:

 Syntax error on token ">", void expected after this 

我尝试使用(Order<MenuItem>).classOrder.classnew Order<MenuItem>().getClass()而没有更好的运气。

如何检索泛型类的.class属性?

2 个答案:

答案 0 :(得分:2)

正确的语法是:

Order.class

在Java中,Order<MenuItem>.classOrder.class在运行时是相同的类,泛型类型信息(<MenuItem>类型参数)在运行时会丢失,因为type erasure - Java的泛型类型系统的严重限制。

答案 1 :(得分:1)

如果您更改类型以发布内部类型,您可以这样做:

public class CouchDbRepositorySupport<C, T extends CouchDbRepositorySupport<C>> implements GenericRepository<T> {
...

    protected CouchDbRepositorySupport(Class<C> type, CouchDbConnector db) {
        ...
    }

public class OrderRepository extends CouchDbRepositorySupport<MenuItem, Order<MenuItem>> {

    public OrderRepository(CouchDbConnector db) {
        super(MenuItem.class, db);

您可以选择如何声明父类;这只是一个例子。

免责声明:我是在没有IDE的情况下手工完成的,所以可能会有一些小的语法问题,但这个概念应该有效。