1

为什么在 中Collection<T>,方法 booleanremove(Object o)未定义为boolean remove(T o)

例如,当我有一个Collection<String> list我确定我不想这样做list.remove(new Date())时。

编辑:已经解决:为什么 Java Collections 删除方法不是通用的?

问题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 列表中,然后将其删除,因此我需要某种类型的演员表。

谢谢你。

4

3 回答 3

2

关于你的第二个问题:只做removeInternal非通用的。它应该使用与您的第一个问题的答案中描述的相同的逻辑:removeInternal(o)删除一个e这样的对象(o==null ? e==null : o.equals(e))。(如果你实现的逻辑不等同于此,你就违反了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)将正确地将第ith项转移到deletedItems并调整项目的内部计数。重要的是要注意,被删除的元素不一定与参数中传递的对象相同;它只是满足相等谓词的第一个元素。

于 2012-10-22T22:25:32.717 回答
0

这是不可能的,但即使是,你也不应该这样做。

如果它等于另一个项目,您应该删除该项目。故意不要求它是同一类型,因此您应该检查它是否相等然后删除 - 与它是哪种类型无关。

于 2012-10-22T22:27:17.890 回答
0

您不能转换为这样的泛型类型T。在这种情况下,将在您的示例中使用最具体的已知类型Value

你可以做的是Class<T>在你的集合构造函数中传递一个类型的参数,然后使用class.cast(). 这不会产生未经检查的强制转换警告,但与示例中的代码同样不安全。

于 2012-10-22T22:25:18.787 回答