Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在引用模板对象时,如何更严格地保证正确的类型转换?_Java_Eclipse_Generics_Compiler Warnings_Suppress Warnings - Fatal编程技术网

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

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

我有一个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 ...
}
我不认为这会是一个问题,因为它已经在类的顶部定义了,
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