4

「2レベル」のキャストを実装しようとしている問題が発生しています。

以下は、私がやろうとしていることを示す単純化されたコードです:

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>

T2 つのジェネリックとUforを入れようとしました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);
    }
}

それ以外の場合は、名前の衝突を避けるためにgetsetの名前を変更する必要がありますが、親を覚えておくと、この方法で公開されます。Array2DSoftRefsgetset

于 2012-12-20T01:06:03.007 に答える