用泛型强制类声明
问题描述:
我想实现一个抽象的Hierarchy类。任何Hierarchy对象都应该有一个父级(可以为null)和一组子级,这两个子级与具体的Hierarchy实现类型完全相同。这可以用泛型来完成,如果没有,有什么机制来强化这种关系?用泛型强制类声明
这里是我至今想,但也有问题:
public abstract class Hierarchy<T extends Hierarchy<T>> {
private T parent;
private Set<T> children;
public T getRoot() {
if(parent == null) {
return this;
} else {
return parent.getRoot();
}
}
}
问题是与return this
。它给出了编译错误,因为this
的类型为Hierarchy
,而不是T
。我无法施展它,因为我实际上并不保证this
的类型为T
。下面的声明会编译得很好:
public class B extends Hierarchy<B> {...}
public class A extends Hierarchy<B> {...}
那么有没有什么办法可以禁止A extends Hierarchy<B>
声明?
答
那么有没有什么办法可以禁止扩展层次结构 声明?
不,这是不可能的。
你可以做你想做的是这样的:
public abstract class Hierarchy<T> {
private T parent;
private Set<T> children;
public static <E extends Hierarchy<E>> E getRoot(E x) {
while (x.parent != null) {
x = x.parent;
}
return x;
}
}
答
那么有什么办法可以禁止
A extends Hierarchy<B>
声明?
当然有,但你可以忽略模板,因为T
必须始终是A
的实例。因此,此代码将符合您的要求:
public class B extends A { ... }
public class A extends Hierarchy<B> { ... }
这里,A是B的一个实例,因此您可以返回A作为T(= B)。
但我想不出任何有意义的情况。如果你让getRoot()
返回一个Hierarchy<?>
对象并将其转换为你所期望的 - 但要小心,如果你没有得到你期望的类型,这可能会抛出ClasCastException
。
看起来这仍然将是有益的做'层次>' –
Jaws212
2014-10-07 01:12:58