4

我遇到了一个问题,我正在尝试实施“两级”铸造。

下面是显示我正在尝试做的简化代码:

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

直到那里,没有问题。

我正在尝试扩展此类,例如我可以在 getter 和 setter 中封装 SoftReferences 的使用:

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注释无法帮助我(队长明显)。

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

我试图放入两个泛型TUfor SoftReference<T>,但没有成功。

4

1 回答 1

9

问题Array2DSoftRef.get在于您不能覆盖一个方法并使其返回类型不那么具体(例如SoftReference<T>-> T)。

问题在于,如果方法具有不同的参数(例如,而不是) Array2DSoftRef.set,则您不能覆盖该方法,但是如果在擦除之后它具有相同的参数,您也不能重载它。TSoftReference<T>

我建议你在这里使用组合而不是继承:

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);
    }
}

否则,您将不得不重命名您的getsetinArray2DSoftRefs以避免名称冲突 - 但请记住父级get,并且set仍然会以这种方式公开。

于 2012-12-20T01:06:03.007 回答