コレクションインターフェイスアドレスにcontainsAll()およびretainAll()はありますか?
-
03-07-2019 - |
質問
Javaでは、AbstractCollectionクラスのcontainsAllおよびretainAllは、カーディナリティが尊重されないことを明示的に示しているため、各側に値のインスタンスがいくつあるかは関係ありません。標準ライブラリのすべてのJavaコレクションはAbstractCollectionを拡張するため、すべてが同じように機能すると想定されています。
ただし、Collectionインターフェイスのこれらのメソッドのドキュメントには何も記載されていません。 AbstractCollectionから推測することを想定していますか、それとも異なる動作をするコレクションを定義できるようにするために意図的に指定されていませんでしたか?
たとえば、apache-collectionsのBagは、カーディナリティを尊重することを明示的に示しており、実際にはそうではありませんが、Collectionからのバージョンの契約に違反していると主張しています。
では、AbstractCollectionではなくCollectionのこれらの操作のセマンティクスは何ですか?
編集:なぜ私が気にするのか疑問に思っている人は、博士号の一部として。私は、開発者がApacheの適合性違反を期待していないことを示しましたが、Collectionインターフェースがあまりにも曖昧なままである理由を理解しようとしています。
解決
containsAll(コレクション内)のjavadocsは次のように言います:
戻り値:このコレクションの場合はtrue 内のすべての要素が含まれます 指定されたコレクション
and retainAll(コレクション内):
この中の要素のみを保持します に含まれるコレクション 指定されたコレクション(オプション 操作)。つまり、削除します このコレクションから に含まれていない要素 指定されたコレクション。
containsAllのコントラクトを読んで、bの各要素bElemに対してa.contains(bElem)を呼び出すとtrueが返される場合に限り、a.containsAll(b)を呼び出すとtrueが返されることを意味します。また、a.containsAll(someEmptyCollection)もtrueを返すことを意味します。 AbstractCollectionのjavadocsでより明確に次のように述べています:
この実装は、 指定されたコレクション、それぞれをチェック イテレータによって返される要素 これに含まれているかどうかを確認します コレクション。すべての要素がそうであれば 含まれているtrueが返され、そうでない場合 false。
containsAllのCollectionの連絡先は、混乱の可能性を避けるために、より明確にする必要があることに同意します。 (そして、AbstractCollectionのjavadocsを読むことは、Collectionsの理解を確認するために必要ではなかったはずです)
retainAllを呼び出した後、重複する要素の数に関しては仮定しませんでした。 (私の読書による)Collectionに記載されている契約は、どちらのコレクション内の重複がどのように処理されるかを意味しません。コレクション内のretainAllの私の読み取りに基づいて、a.retainAll(b)の複数の可能な結果はすべて妥当です:
- 結果には、aとbの両方に少なくとも1つのコピーがある各要素が1つ含まれています
- 結果には、bにない要素を除き、aにあった各要素(重複を含む)が含まれます
- または偶数には、1からaの各要素のaで見つかったコピーの数までのいずれかが含まれますが、bには含まれません。 #1または#2のいずれかを期待していましたが、3つのうちのいずれかが契約に基づいて合法であると想定していました。
AbstractCollectionのjavadocsは、#2を使用していることを確認します:
この実装はこれを反復します コレクション、各要素をチェック イテレータから順に返されます 指定されたものに含まれているかどうかを確認します コレクション。含まれていない場合は、 このコレクションから削除されます イテレータのremoveメソッド
これは元のCollectionインターフェースの契約を読んでいるわけではないので、必ずしもCollectionの動作が一般的にこのようになるとは思わないでしょう。
おそらく、完了したら、提案された更新をJavaDocに送信することを検討する必要があります。
「Collectionインターフェースがあまりにも曖昧になっている理由」について-意図的に行われたのではないかと真剣に疑っています-おそらく、APIのその部分が書かれているときに正当な優先順位が与えられなかったものだけです。
他のヒント
Collectionはこの方法や他の方法で定義するとは思わないが、単に google-collections 実行:マルチセットのドキュメント(マルチセットはバッグと呼ばれるものです)