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 в getter и 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 аннотация не может помочь мне (капитан очевидно).

Я не могу понять, как вернуть T введите из SoftReference<T> шаблон.

Я попытался вставить два дженерика T а также U за SoftReference<T>, но безуспешно.

1 ответ

Решение

Проблема с Array2DSoftRef.get является то, что вы не можете переопределить метод и сделать его тип возврата менее конкретным (например, SoftReference<T> -> T).

Проблема с Array2DSoftRef.set является то, что вы не можете переопределить метод, если у него есть другие параметры (например, T вместо SoftReference<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);
    }
}

В противном случае вам придется переименовать ваш get а также set в Array2DSoftRefs чтобы избежать столкновения имен - но помните родителя get а также set все равно будет публично разоблачен таким образом.

Другие вопросы по тегам