1

Collection<T>で、メソッドbooleanremove(Object o)がとして定義されていないのはなぜboolean remove(T o)ですか?

私が持っているとき、私は例えばCollection<String> listやりたくないと確信していlist.remove(new Date())ます。

編集:すでに解決済み:Javaコレクションがメソッドを削除しないのはなぜですか?

質問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

2番目の質問について:removeInternal非ジェネリックにするだけです。最初の質問への回答で説明されているのと同じロジックを使用する必要があります。つまり、trueとなるようなremoveInternal(o)オブジェクトを削除します。(これと同等ではないロジックを実装すると、インターフェイスのコントラクトに違反することになります。)ジェネリックは必要ありません。e(o==null ? e==null : o.equals(e))CollectionremoveInternal

編集これは、非ジェネリックを実装する方法の例です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

そのような一般的なタイプにキャストすることはできませんT。この場合、あなたの例では、最も具体的な既知のタイプが使用されますValue

代わりにできることはClass<T>、コレクションコンストラクターで型のパラメーターを渡し、を使用して値をキャストすることですclass.cast()。これにより、チェックされていないキャスト警告は生成されませんが、例のコードと同様に安全ではありません。

于 2012-10-22T22:25:18.787 に答える
0

それは不可能ですが、たとえそうであっても、そうすべきではありません。

他のアイテムと等しい場合は、そのアイテムを削除する必要があります。意図的に同じタイプである必要はないので、等しいかどうかを確認してから削除する必要があります。どのタイプであるかは関係ありません。

于 2012-10-22T22:27:17.890 に答える