我有一个抽象类
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而不会产生编译器警告或错误。
答案 0 :(得分:0)
我玩了一段时间,你的第二次尝试非常接近,只缺少一个<T>
。
public List<AbstractEntity<? extends AbstractEntity<T>>> getAllAbstractEntitys(String boId) {}
似乎可以做到这一点! 编译器没有显示警告!