【发布时间】:2014-01-11 00:55:57
【问题描述】:
我试图在 java 中创建两个相互包含的类之间的泛型关系。这些对象基本上形成了一个交替的层树。到目前为止,我发现的最接近的 SO 问题是:Java generics of generics of,这很接近并且对我的问题有所帮助,但仍然有足够的不同,我需要额外的指导。这是情况,或者更确切地说,是我想要的情况:
abstract class Group<I extends Item<Group<I>>>{
private List<I> items;
public List<I> getItems(){...}
public void setItems(List<I> items){...}
}
abstract class Item<G extends Group<Item<G>>>{
private List<G> subGroups;
public List<G> getSubGroups(){...}
public void setSubGroups(List<G> subGroups){...}
}
除了 getter 和 setter 之外,类的某些方面使它们彼此显着不同,但包含应该遵循这样。这背后的原因是我想强制执行,如果我有实现类,它们必须表现得像这样:
class AGroup extends Group<AItem>{...} //works
class AItem extends Item<AGroup>{...} //works
class BGroup extends Group<BItem>{...} //works
class BItem extends Item<BGroup>{...} //works
class MixedGroup extends Group<AItem>{...} //fails since AItem does
//not extend Item<MixedGroup>
到目前为止,编译器都很好
abstract class Group<I extends Item<Group<I>>>{
private List<I> items;
public List<I> getItems(){...}
public void setItems(List<I> items){...}
}
abstract class Item<G extends Group>{ //raw types warning
private List<G> subGroups;
public List<G> getSubGroups(){...}
public void setSubGroups(List<G> subGroups){...}
}
这主要涵盖了我正在寻找的内容,因为我可以知道我可以获得一个组的项目的子组并返回相同类型的组。但是编译器不知道如果我得到一个项目的组的项目,我会得到相同类型的项目(例如,项目可能是一个孤儿)。此外,原始类型警告总是让我觉得我做错了什么。另外,如果有更好的方法来执行这种类绑定,我很想听听。
【问题讨论】: