如何避免在重写Collection的方法中未经检查的强制转换?

cra*_*esh 2 java generics collections

我正在进行List实施.因此,我必须覆盖这些方法

Collection.containsAll(Collection<?> c);
Collection.removeAll(Collection<?> c);
Collection.retainAll(Collection<?> c);
Run Code Online (Sandbox Code Playgroud)

但正如Sun所解释的那样,他们接受任何类型内容的集合(请注意<?>).因此编译器不会检查集合,而是由我来检查它.但怎么办呢?instanceof由于类型擦除,每个元素都不起作用.下一个解决方案是将每个元素强制转换为ClassCastException.看这里:

public boolean containsAll( Collection<?> c ) {
    boolean foundAll = true;
    for ( Object element : c ) {
        try {
            foundAll &= this.contains( (T) element );
        } catch ( ClassCastException e ) {
            foundAll = false;
        }
    }
    return foundAll;
}
Run Code Online (Sandbox Code Playgroud)

其他两种方法看起来相似.这样可行.但它给了我编译器警告"警告:[unchecked] unchecked cast"!除非我用" @SuppressWarnings("unchecked")"来压制它,否则它将无法正常编译.

@SuppressWarnings("unchecked")除非我真的需要,否则我不想依赖" ".有没有办法避免它?你会如何实现这些方法containsAll(Collection<?> c)

编辑

对不起,伙计们,我还不够清楚.我不延伸AbstractList,我不想.我的列表由平衡二叉树实现.我有一个自己的实现的insert(),remove(),contains()(实际执行的叶子搜索)等,并采取所有的(通用)类型的参数T.关键目标是有一个排序列表,可以在迭代过程中进行修改.

那么......我该如何避免警告containsAll(Collection <?>)呢?我要投!

谢谢!craesh

Joa*_*uer 9

您不需要T在调用时将元素转换为元素,contains()因为它被定义为boolean contains(Object o).请注意,您可以询问Collection<String>它是否contains()Integer对象.没有必要的铸造.

remove()也需要一个Object,所以根本不需要铸造.

顺便说一句:延伸AbstractList带走了实施a的大部分无聊工作List.