我正在执行List
实施。正因为如此,我必须覆盖的方法如何避免重写集合的方法中未经检查的强制转换?
Collection.containsAll(Collection<?> c);
Collection.removeAll(Collection<?> c);
Collection.retainAll(Collection<?> c);
但是因为它是解释by 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;
}
其他两种方法看起来相似。这样可行。但它给了我编译器警告“警告:[unchecked] unchecked cast”!除非我用“@SuppressWarnings("unchecked")
”来压制它,否则它将无法正常编译。
我不想依靠“@SuppressWarnings("unchecked")
”,除非我真的必须。有没有办法避免它?你将如何实现像containsAll(Collection<?> c)
那样的方法?
编辑
好了,对不起你们,我不太清楚。我不扩展AbstractList
,我不想。我的列表是通过一个平衡的二叉树实现的。我有自己的执行insert()
,remove()
,(实际上是搜索叶)等,并且都采用(通用)类型的参数T
。关键目标是拥有一个可以在迭代时修改的排序列表。
那么...我如何避免containsAll(Collection <?>)
的警告?我必须投!
谢谢! craesh
btw:只要foundAll是假的,你应该从你的循环中突破,否则你会做不必要的工作。实际上,你可以完全摆脱布尔标志。 – 2009-10-21 12:15:09
哇,我从来没见过&=操作符。谢谢! – 2009-10-21 12:54:07
@Joachim:谢谢,这是一个好主意! @matt:我很少使用它,但有时它非常有用;) – craesh 2009-10-21 13:41:56