我遇到了一个问题,我试图实现“两级”强制转换。

以下是简化的代码,以显示我要执行的操作:

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>类型。

我试图为T放入两个泛型USoftReference<T>,但是没有成功。

最佳答案

Array2DSoftRef.get的问题在于您无法覆盖方法并使它的返回类型不太具体(例如SoftReference<T>-> T)。
Array2DSoftRef.set的问题在于,如果方法具有不同的参数(例如T而不是SoftReference<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);
    }
}

否则,您必须在get中重命名setArray2DSoftRefs以避免名称冲突-但请记住,父getset仍将以这种方式公开显示。

09-05 18:08