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
все равно будет публично разоблачен таким образом.