Java 在引用模板对象时,如何更严格地保证正确的类型转换?
我有一个Java类,它充当另一个泛型类的容器。它将泛型类的对象存储在向量中。由于过于复杂的原因,主要与强制重构有关(感谢Gil),该类包含一个只向向量添加元素的方法。总之,我有这样的想法:Java 在引用模板对象时,如何更严格地保证正确的类型转换?,java,eclipse,generics,compiler-warnings,suppress-warnings,Java,Eclipse,Generics,Compiler Warnings,Suppress Warnings,我有一个Java类,它充当另一个泛型类的容器。它将泛型类的对象存储在向量中。由于过于复杂的原因,主要与强制重构有关(感谢Gil),该类包含一个只向向量添加元素的方法。总之,我有这样的想法: public abstract class DataElementArray<E extends DataElement> extends ComplexDataElement implements DataElement, Iterable<E> { private Vect
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 ...
}
我不认为这会是一个问题,因为它已经在类的顶部定义了,E
扩展了DataThing
除了使用
@SuppressWarnings
注释来关闭Eclipse提示服务(这是它自己建议的,很奇怪),我还能做些什么来减轻这个警告呢?即使我知道源类总是可以强制转换到目标中,我是否应该麻烦地将这一行包含在try{}catch(ClassCastException)
块中?当您在这里强制转换到E
时,您不能也不应该消除此警告。源类,DataElement
,可能并不总是能够强制转换到目标E
。您不能强制转换到E
,因为E
可能是DataElement
的子类,这里的向下转换是完全不合适的
解决此问题的最简单方法是将参数
de
设置为E
类型,但鉴于此方法似乎覆盖了超类ComplexDataElement
中的某些内容,超类方法也需要采用E
。这意味着ComplexDataElement
应该是泛型的,类似于
。为什么这些方法不采用E
,而不是DataElement
?因为该类是AbstractDataElement
的几个子类之一,它们不使用泛型,抽象超类原型需要DataElement
。
Type safety: Unchecked cast from DataElement to E