为什么在Collection<T>
中将布尔remove(Object o)
方法未定义为boolean remove(T o)
?
当我有Collection<String> list
时,我可以确定自己不想做list.remove(new Date())
。
编辑:已经解决:Why aren't Java Collections remove methods generic?
问题2:
当我上课时:
class Value {
Object getValue() {
// return something;
}
}
然后我想实现一个新的很酷的清单:
class CoolList<T extends Value> implements Collection<T> {
// ...
@Override
public boolean remove(Object o) {
try {
T value = (T) o; // I mean the cast here
removeInternal(value);
} catch (ClassCastException e) {
return false;
}
}
}
我如何在不产生警告(未经检查的演员表)且不使用@SuspressWarning的情况下进行干净的演员表,这甚至有可能吗?
编辑:
在内部,我希望列表能够恢复已删除的项目,因此,我内部具有
List<T> deletedItems
。所以removeInternal()方法将要删除的项目追加到内部的DeletedItems列表中,然后将其删除,因此,我需要某种类型的转换。
谢谢。
最佳答案
关于第二个问题:只需将removeInternal
设为非通用。它应使用第一个问题的答案中所述的相同逻辑:removeInternal(o)
删除对象e
,以使(o==null ? e==null : o.equals(e))
为true。 (如果您实现的逻辑与此不同,则您违反了Collection
接口的约定。)不需要通用的removeInternal
。
编辑这是一个如何实现非通用removeInternal
的示例:
private boolean removeInternal(Object o) {
for (int i = 0; i < currentSize; ++i) {
T elt = get(i);
if (o == null ? elt == null : o.equals(elt)) {
removeElementAtPosition(i);
deletedItems.add(elt);
return true;
}
return false;
}
}
假定
removeElementAt(int)
将正确地将第i
个项目转移到deletedItems
并调整项目的内部计数。重要的是要注意,被删除的元素不一定与参数中传递的对象相同。它只是满足相等谓词的第一个元素。