我正在執行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