2012-12-20 42 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