抽象递归泛型列表

时间:2015-01-28 15:30:37

标签: java generics

我有一个抽象类

abstract class AbstractEntity<T extends AbstractEntity<T>> {
  Id<T> id;
  //...
}

由于类型为Id,通用声明主要是必需的,因此如果类型为Id,则用户具有id。当我只使用具体类时,它在类型泛型classe(如带有这些类的列表)时非常有效。

class UserDao {
  List<User> getAllUsers() {
    //...
  }
}

当我有一个具有几个具体类的抽象超类时,例如业务对象的历史记录

abstract HistoryElement<T extends HistoryElement<T>> {
 //...
} 

class CreateHistoryElement extends HistoryElement<CreateHistoryElement> {}
class EditHistoryElement extends HistoryElement<CreateHistoryElement> {}

我不能简单地写下面的选项:

class HistoryElementDao {
   List<HistoryElement<?>> getAllHistoryElements(Id<BusinessObject> boId) {/*...*/} // produces a compile error since the Parameter T is bound to extend AbstractEntity
   List<HistoryElement> getAllHistoryElements(Id<BusinessObject> boId) {/*...*/} // produces a compiler warning (not parametrized)
   List<HistoryElement<HistoryElement>> getAllHistoryElements(Id<BusinessObject> boId) {/*...*/} // produces a compiler warning (not parametrized)
   List<HistoryElement<? extends HistoryElement> getAllHistoryElements(Id<BusinessObject> boId) {/*...*/} // produces a compiler warning (not parametrized)
List<HistoryElement<HistoryElement<HistoryElement<HistoryElement<HistoryElement<HistoryElement<...>>>>>> getAllHistoryElements(Id<BusinessObject> boId) //endless recursion

问题:有没有办法对类List进行参数化,以便它可以包含所有类型的HistoryElements而不会产生编译器警告或错误。

1 个答案:

答案 0 :(得分:0)

我玩了一段时间,你的第二次尝试非常接近,只缺少一个<T>

public List<AbstractEntity<? extends AbstractEntity<T>>> getAllAbstractEntitys(String boId) {}

似乎可以做到这一点! 编译器没有显示警告!