【发布时间】:2011-09-27 08:33:04
【问题描述】:
我要为我的一个项目添加通用性。 我喜欢泛型,因为这使我的代码更加健壮、自我记录并消除了所有那些丑陋的演员表。
但是,我遇到了一个棘手的案例,并且在尝试为我的一个结构表达“递归”约束时遇到了一些问题。
这基本上是某种“通用”树,带有双链接(指向子级和父级)。我最大程度地简化了课程以显示问题:
public class GenericTree<
ParentClass extends GenericTree<?, ?>,
ChildClass extends GenericTree<?, ?>>
{
// Attributes
private ArrayList<ChildClass> children = new ArrayList<ChildClass>();
private ParentClass parent = null;
// Methods
public void setParent(ParentClass parent) {
this.parent = parent;
}
public void addChild(ChildClass child) {
child.setParent(this);
this.children.add(child);
}
}
问题在于指令:child.setParent(this)。
Java 给出以下错误:
绑定不匹配:类型为 ChildClass 的方法 setParent(?) 不适用于
参数(通用树)。通配符参数 ?没有更低的 绑定,并且实际上可能比参数更具限制性 通用树
我想要的是能够表达类似的东西:
public class GenericTree<
ParentClass extends GenericTree<?, ?>,
ChildClass extends GenericTree<[THIS_VERY_CLASS], ?>>
要说子类的父类应该是它自己...
我看过一些关于自边界泛型的文章,但我不知道如何在这种情况下应用它。
任何帮助将不胜感激。
【问题讨论】:
-
为什么树在节点类型方面不是同质的?我认为没有理由单独指定子节点类型和父节点类型。但是,如果您区分叶子和内部节点,我确实理解。
-
另外,如果这无法实现,我希望至少能够使用演员表。为此,我需要能够引用我的声明的第三个通配符 (?) 类。有可能吗?
-
因为那太简单了。在这里,我们有使用 Country -> Location -> Building -> Room 的树,唯一的共同属性是“name”。我觉得这对泛型来说是不可能的......
-
要能够转换,必须先转换成非泛型类型,像这样:
return (GenericTree<Type>)((GenericTree)obj);需要SuppressWarning({"unsecure", "rawtypes"}) -
@Eyal:是的,实际的树具有异构节点类型。类似于:风电场的聚合 WindFarm Wind Turbines Cluster Wind Turbine 例如,风力集群类的声明如下所示: class WindCluster
...不,叶子没有与内部节点分离。
标签: java generics nested-generics