我有一个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 ...
}
在执行从DataElement
到E
的类型转换的那行上,Eclipse给了我以下警告:
Type safety: Unchecked cast from DataElement to E
我不认为这会是一个问题,因为它已在E
扩展DataThing
的课程顶部定义。
没有使用@SuppressWarnings
注释来关闭Eclipse提示服务(它建议自己,奇怪的是),我还能做些什么来缓解这个警告?我是否应该在try {} catch(ClassCastException)
块中包含此行,即使我知道源类始终可以转换为目标?
答案 0 :(得分:0)
当您在此处投放到E
时,您无法撤消此警告。源类DataElement
可能无法始终转换为目标E
。您无法转换为E
,因为E
可能是DataElement
的子类,而此处的向下广告完全不合适。
解决此问题的最简单方法是创建de
类型的参数E
,但鉴于此方法似乎覆盖了超类ComplexDataElement
中的某些内容,超类方法需要也请E
。这意味着ComplexDataElement
应该是通用的,例如<E extends DataElement>
。