为什么在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并调整项目的内部计数。重要的是要注意,被删除的元素不一定与参数中传递的对象相同。它只是满足相等谓词的第一个元素。

10-08 15:02