我试图在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){...}
}
这基本上涵盖了我所寻找的,因为我知道我可以获取一个组的子组的项并且可以获得相同类型的组。但编译器不知道如果我获取一个项的组的项,我会得到相同类型的项(例如,该项可能是孤儿)。另外,原始类型警告总是让我感觉像是在做错事情。还有,如果有更好的强制执行这种类绑定的方法,我会很感兴趣听听。