我遇到了一个问题,我正试图实施“两级”演员。
以下是显示我要做的事情的简化代码:
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
添加两个泛型U
和SoftReference<T>
,但没有成功。
答案 0 :(得分:9)
Array2DSoftRef.get
的问题在于您无法覆盖某个方法并使其返回类型不那么具体(例如SoftReference<T>
- &gt; 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
中的set
和Array2DSoftRefs
以避免名称冲突 - 但请记住父get
和set
将仍然以这种方式公开曝光。