2014-10-04 195 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