2012-12-20 157 views
4

我正在嘗試實現一個「兩級」鑄造的問題。派生泛型類型的java刪除

下面是簡單的代碼來顯示什麼,我試圖做的:

public class Array2D<T> 
{ 
    private T[][] _array; 
    .... 
    public T get(int x , int y) 
    .... 
    public void set(T o , int x , int y) 
} 

直到有沒有問題。

我想擴展這個類,如我可以封裝使用在吸氣SoftReferences和setter的:

public class Array2DSoftRefs<T> extends Array2D<SoftReference<T>> 
{ 
    public T get(int x , int y) 
    { 
     return super.get(x,y).get(); // get the array element, then the SoftReference contents 
    } 
    .... 
    public void set(T o , int x , int y) 
    { 
     super.set(new SoftReference<T>(o) ,x,y); // generate the SoftReference on-the-fly 
    } 

}

事實上,我拉開序幕,因爲編譯器/語法分析器跳過了泛型刪除,然後@Override註釋不能幫助我(隊長顯而易見)。

我不知道如何從SoftReference<T>模板返回T類型。

我試着爲SoftReference<T>放入兩個仿製藥TU,但沒有成功。

+3

術語_template_未在Java中使用。術語_generics_和_type parameters_用於替代。 – jahroy

+0

什麼是確切的編譯器錯誤信息? – Bohemian

+0

@jahroy感謝編輯和單詞,我仍然懷念我的C++背景。 – Benj

回答

9

Array2DSoftRef.get的問題在於,您無法覆蓋某個方法並使其返回類型不那麼具體(例如SoftReference<T> - >T)。

Array2DSoftRef.set的問題是,不能覆蓋的方法,如果它有不同的參數(例如的代替TSoftReference<T>),但也可以不超載它是否會erasure後具有相同的參數。

我會建議你用的組合物,而不是繼承的位置:

public class Array2DSoftRefs<T> { 

    private final Array2D<SoftReference<T>> inner = ...; 

    public T get(int x , int y) { 
     return inner.get(x,y).get(); 
    } 

    public void set(T o , int x , int y) { 
     inner.set(new SoftReference<T>(o), x, y); 
    } 
} 

否則,你將不得不重新命名您的getArray2DSoftRefsset避免名稱衝突 - 但請記住父getset仍然會這樣公開曝光。

+2

+1。 OP:請記住,通過使'Array2DSoftRefs '擴展'Array2D >'您聲明前者可以在後者使用的任何地方使用(Liskov替換原則) - 在您的情況下這不是很有用,因爲您試圖使SoftReference邏輯對用戶不可見。如果你想指出'Array2DSoftRefs '可以替代任何'Array2D ',創建一個包含所有'Array2D'方法的接口,並且這兩個類都可以擴展它。 –

+0

好的謝謝!看起來唯一的解決方案是你的:我將創建一個通用接口IArray2D,以確保這些類的擦除,並使它們相同的擦除。 – Benj