2012-05-15 91 views
6

我试图扩大与构造以下类(从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属性?

+1

似乎有这些一周之一。 –

+2

@PaulBellora可能是因为任何Google查询或SO查询仅返回有关在运行时查找通用对象类型的问题。这个问题有些不同。 –

回答

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的情况下手工完成了这个任务,所以可能会有一些小的语法问题,但是这个概念应该可行。

2

正确的语法是:

Order.class 

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

+0

java编译器不同意:'构造函数CouchDbRepositorySupport >(Class ,CouchDbConnector)未定义' –

+0

@jdreux你自己说过:_compiler_。在编译期间检查泛型类型,而在运行时评估表达式'Order .class',并且在运行时从类的类型信息中提取类型参数'',好像它从未存在过 –

+0

因此,对于Order .class,因为它的运行时等效不存在,所以不是语法? –