2014-10-04 66 views
0

我想实现一个抽象的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>声明?

回答

1

那么有没有什么办法可以禁止扩展层次结构 声明?

不,这是不可能的。

你可以做你想做的是这样的:

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; 
    } 
} 
+0

看起来这仍然将是有益的做'层次>' – Jaws212 2014-10-07 01:12:58

-1

那么有什么办法可以禁止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