8

の宣言を見ていたらArrayList

class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

のスーパークラスが同じインターフェースを実装しているにListもかかわらず、これはインターフェースを実装しています。ArrayListAbstractListList

abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>

同様の宣言はHashMapLinkedHashMap宣言にもあります。

ここに画像の説明を入力

の宣言ではLinkedHashMapMapインターフェイスのみを実装し、そのスーパークラスによって実装される他のインターフェイスは実装しませんHashMap

したがって、そのような宣言を行うことにはいくつかの利点があるかもしれません。

4

6 に答える 6

6

それらを再度宣言しても機能的な利点はありません。動作にはまったく影響しません。

どのインターフェースが実装されているかを明確にするために追加されただけだと思います。

于 2013-04-05T12:30:11.797 に答える
3

これは、クラスが実装するインターフェイスをクラスのユーザーにすぐに明確にするために、ドキュメント化のみを目的として行われます。

冗長implements句は、コンパイラには何の違いもありません。

于 2013-04-05T12:30:25.980 に答える
1

はい。省略されていた可能性があります。しかし、それがリストであることはすぐにわかります。それ以外の場合は、コード/ドキュメントをさらにクリックする必要があります。それが理由だと思います-明快さ。

また、Joeri Hendrickx のコメントを追加すると、ArrayList が List を実装していることを示すためです。全体像の AbstractList は、便宜上、および List 実装間のコードの重複を減らすためのものです。

参考:なぜArrayListに「implements List」があるの?

于 2013-04-05T12:38:52.783 に答える
0

このようにList<E>、 のサブクラスを作成するときにメソッドを実装する必要があり、を としてAbstractList使用することもできます。ArrayListAbstractList

于 2013-04-05T12:31:21.357 に答える
0

ArrayList<T>さまざまな目的のためにAbstractList<T>実装します。List<T>

  • List<T> クラスがリストであるために必要なものを確立します。
  • ArrayList<T>List<T>独自のインターフェイスを定義する一部として実装されます。これはあるものにとって不可欠ArrayList<T>です。
  • ArrayList<T>AbstractList<T>独自の実装の一部として拡張されます。これは完全にオプションです。ArrayList<T>継承せずに最初から実装することもできAbstractList<T>、クラスは同じように機能します。
  • AbstractList<T>の他の実装の基本クラスとして意図されていList<T>ます。インターフェイスを確立する代わりに、既存のインターフェイスに従います。AbstractList<T>の実装List<T>は必要ありません。それがなくても、すべてが同じようにコンパイルおよび実行されます。ただし、継承List<T>により、Java コンパイラはインターフェイス メソッドと のメソッド間の潜在的な不一致を見つけることができるため、インターフェイスを実装するAbstractList<T>ことは非常に良い考えです。AbstractList<T>List<T>
于 2018-02-15T13:21:10.837 に答える