2016-03-22 8 views
1

私はインターフェイスが何であり、何がコレクションなのか知っています。しかし、正直言って、1つのクラスに2つのコレクションインターフェイスを実装しない理由は何もありませんでした。2つのコレクションインターフェイスを一緒に実装するべきではないのはなぜですか?

この質問は数日前にインタビューで尋ねました。

+1

それ以外の場合は、混乱するAPIが作成されます。リストと地図の両方に何かがあるとはどういう意味ですか?ほとんどの場合(すべてではありませんが、ほとんどの場合)、ListとMapの両方を含むクラスがあれば、それはより明確になります。これを合成といいます。 – yshavit

答えて

2

場合によっては、同じオブジェクトによって実装されるか、または同じオブジェクトによって実装されることがあります。

キューとリストの両方がLinkedListによって実装されている場合、TreeMapはNavigableMapとSortedMapの両方です。このような例がいくつかあります。

それぞれは、コレクションの特性や機能を示しています(使用方法として公開されています)。

多くの場合、それはすべて意味がありません。 Javaコレクションが2つのインタフェースを実装するには、両方のインタフェースを完璧に実装する必要があります(そしておそらくそれがあなたの答えです)。

linkedlistは、技術的にArrayListのメソッドを実装する必要がありますが、実際には悪い考えです。

+0

標準的なJavaが実際にこれを行うことを最初に指摘してくれたことにプラスがあります。 –

+0

標準のJavaがすでにそれを行っているのなら、なぜそれは使用されるべきではないのですか?本当にデザインに依存しなければならない。私はそうだと思います –

+0

@PritamBanerjeeそれはあなたが話しているコレクションのインターフェイスに依存しています。 'Queue'と' List'は互換性がありませんが、他のペアがあるかどうかわかりません。 –

1

最初に、互換性のないメソッド契約があります。 List.addは常にtrueを返す必要があり、要素が既に存在する場合はSet.addは常にfalseを返す必要があります。

+0

mutableが 'UnsupportedOperationException'を投げることが許されているメソッドとして、*不変の*' ListSet'を持つことができると思います。 –

+1

@PaulBoddington、互換性のない契約を持つ唯一のメソッドは 'add'ではありません。 'equals'と' hashCode'にも互換性のない契約があり、あなたのコレクションを不変にすることはその違いを調整するのに役立ちません。 –

+0

良い点。非常に賢明なコメントではありませんでした。 –

1

既に作成されていない別のポイントは、同じインターフェイスを異なるタイプのパラメータで2回実装できないことです。

結果として、クラスにList<String>Collection<Integer>の両方を実装しようとすると、コンパイラエラーが発生します。これは、List<String>Collection<String>に拡張されているため、異なるタイプのパラメータでCollectionを2回実装しようとしているためです。あなたが一度に2つのコレクションインタフェースを実装するために管理しなかった場合

、それはLinkedListの例のようでなければならないであろう(一般的なタイプは、あなたがListとしたときにDequeと考えると考える場合も同じです)。

関連する問題