在引用模板对象时,如何更严格地保证正确的类型转换?

时间:2014-09-24 19:41:55

标签: java eclipse generics compiler-warnings suppress-warnings

我有一个Java类,它充当另一个泛型类的容器。它将泛型类的对象存储在向量中。由于太复杂而无法进入的原因,主要与强迫重构有关(感谢Gil),该类包含的方法除了向向量添加元素外什么都不做。总而言之,我有这样的事情:

public abstract class DataElementArray<E extends DataElement>
extends ComplexDataElement
implements DataElement, Iterable<E>
{
    private Vector<E> m_vMembers ;

    @Override
    public abstract DataElementArray<E> addChild( DataElement de ) ;
    // This method is expected to make use of the following utility method:

    @Override
    protected DataElementArray<E> addChildToVector( DataElement de )
    {
        m_vMembers.add( (E)de ) ;
        return this ;
    }

    // other stuff ...
}

在执行从DataElementE的类型转换的那行上,Eclipse给了我以下警告:

Type safety: Unchecked cast from DataElement to E

我不认为这会是一个问题,因为它已在E扩展DataThing的课程顶部定义。

没有使用@SuppressWarnings注释来关闭Eclipse提示服务(它建议自己,奇怪的是),我还能做些什么来缓解这个警告?我是否应该在try {} catch(ClassCastException)块中包含此行,即使我知道源类始终可以转换为目标?

1 个答案:

答案 0 :(得分:0)

当您在此处投放到E时,您无法撤消此警告。源类DataElement可能无法始终转换为目标E。您无法转换为E,因为E可能是DataElement的子类,而此处的向下广告完全不合适。

解决此问题的最简单方法是创建de类型的参数E,但鉴于此方法似乎覆盖了超类ComplexDataElement中的某些内容,超类方法需要也请E。这意味着ComplexDataElement应该是通用的,例如<E extends DataElement>