Java集合<;T>;删除()

Java集合<;T>;删除(),java,generics,collections,Java,Generics,Collections,为什么在集合中,布尔删除(对象o)方法没有定义为布尔删除(to) 当我有一个收藏列表时我确信我不想做列表。例如,删除(new Date()) 编辑:已解决: 问题2: 当我上课时: class Value { Object getValue() { // return something; } } 然后我想实现一个新的酷列表: class CoolList<T extends Value> implements Collection<T> {

为什么在
集合
中,布尔
删除(对象o)
方法没有定义为
布尔删除(to)

当我有一个
收藏列表时
我确信我不想做
列表。例如,删除(new Date())

编辑:已解决:

问题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;
        }
    }
}
类CoolList实现集合{
// ...
@凌驾
公共布尔删除(对象o){
试一试{
T value=(T)o;//我指的是这里的类型
removeInternal(值);
}catch(ClassCastException e){
返回false;
}
}
}
如何在不产生警告(未选中的强制转换)和不使用@SuspensPressWarning的情况下执行干净强制转换,这可能吗

编辑: 在内部,我希望列表能够恢复已删除的项目,因此我在内部有一个
列表deletedItems
。 因此removeInternal()方法将要删除的项附加到内部deletedItems列表,然后删除它,因此我需要某种类型的强制转换


谢谢。

您不能像那样强制转换为泛型类型
t
。在本例中,将使用最具体的已知类型,在您的示例中为
Value


您可以改为在集合构造函数中传递类型为
Class
的参数,然后使用
Class.cast()
强制转换该值。这不会产生未经检查的强制转换警告,但与示例中的代码一样不安全。

关于第二个问题:只需使
removeInternal
非泛型。它应该使用与第一个问题的答案相同的逻辑:
removeInternal(o)
删除对象
e
,这样
(o==null?e==null:o.equals(e))
为真。(如果实现的逻辑与此不同,则违反了
集合
接口的约定。)不需要通用的
removeInternal

EDIT下面是一个示例,说明如何实现非通用的
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;
    }
}
private boolean removeInternal(对象o){
对于(int i=0;i

这假设
removeElementAt(int)
将正确地将
i
th项转移到
deletedItems
并调整项的内部计数。需要注意的是,被移除的元素不一定与参数中传递的对象相同;它只是满足等式谓词的第一个元素。

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


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

第一个问题已经被问到:好的,谢谢您的回答,请阅读将澄清我问题的编辑。@lukstei-当您找到满足删除条件的对象时,即使
removeInternal
的参数声明为
Object
类型,您也会知道它是T类型的。你根本不需要强制转换。是的,但我需要强制转换,因为我想将它添加到deltedEntries列表中,这是List@lukstei-您不需要强制转换,因为您要删除的元素已经是已知的
t
类型。特别是,不要求移除的元素与参数中传递的元素相同;它们必须是相等的()。请参阅我的最新答案。