【问题标题】:java erasures of derived generic type派生泛型类型的java擦除
【发布时间】:2012-12-07 11:23:15
【问题描述】:

我遇到了一个问题,我正在尝试实施“两级”强制转换。

下面是显示我正在尝试做的简化代码:

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 注释无法帮助我(队长明显)。

我不知道如何从 SoftReference&lt;T&gt; 模板返回 T 类型。

我尝试为SoftReference&lt;T&gt; 放入两个泛型TU,但没有成功。

【问题讨论】:

  • Java 中不使用术语模板genericstype parameters 被使用。
  • 确切的编译器错误信息是什么?
  • @jahroy 感谢您的编辑和这个词,我仍然怀念我的 C++ 背景。
  • @PaulBellora 感谢修复。

标签: java generics derived-class type-erasure overriding


【解决方案1】:

Array2DSoftRef.get 的问题在于您不能覆盖一个方法并使其返回类型不那么具体(例如SoftReference&lt;T&gt; -> T)。

Array2DSoftRef.set 的问题在于,如果方法具有不同的参数(例如,T 而不是 SoftReference&lt;T&gt;),则您不能覆盖它,但如果它之后具有相同的参数,您也不能重载它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);
    }
}

否则,您必须将 getset 重命名为 Array2DSoftRefs 以避免名称冲突 - 但请记住父级 getset 仍会以这种方式公开。

【讨论】:

  • +1。 OP:请记住,通过使 Array2DSoftRefs&lt;T&gt; 扩展 Array2D&lt;SoftReference&lt;T&gt;&gt; 您是在声明前者可以在使用后者的任何地方使用(Liskov 替换原则)——这在您的情况下不是很有用,因为您正在尝试使 SoftReference 逻辑对用户不可见。如果您想指出Array2DSoftRefs&lt;T&gt; 可以替代任何Array2D&lt;T&gt;,请创建一个包含所有Array2D 方法的接口,并让两个类都对其进行扩展。
  • 好的,谢谢!看来唯一的解决方案是你的:我将创建一个通用接口 IArray2D 以确保这些类的擦除并使它们具有相同的擦除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多