- PR -

インタフェースの間接実装

1
投稿者投稿内容
cloy
会議室デビュー日: 2004/01/19
投稿数: 16
投稿日時: 2005-01-13 11:51
コレクションフレームワークのListおよびAbstractListは、
コード:
public interface List extends Collection


コード:
public abstract class AbstractList extends AbstractCollection implements List


となっていて、これを実装するArrayListクラスは、
コード:
public class ArrayList extends AbstractList impelements List, ...


となっていると思います。

ここで質問なのですが、ArrayListはAbstractListクラスをextendsしている時点で、
既に間接的にListインタフェースをimplementsしていることになっていると思うのですが、
なぜわざわざ Listインタフェースもimplementsする宣言がなされているのでしょうか?
コード:
public class ArrayList extends AbstractList


としただけの場合とは何か違うのでしょうか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-01-13 12:44
引用:

public class ArrayList extends AbstractList
としただけの場合とは何か違うのでしょうか?


クラス構造からいえば、まったく違いはないです。

わざわざListをimplementsした意図は作った人に聞いてみないと分からないですが、
ArrayListがListインターフェースを実装していると、明示的に示したからでは、と推測します。

どうしても気になるなら、今はたまたまAbstractListがListインターフェースを実装している、けどもしかしたら将来AbstractListからListインターフェースがなくなるかもよ、と思っておくのはどうでしょう?
# まずなくなることはないと思うけど。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-01-13 19:49
unibon です。こんにちわ。
私が以前に投稿した、

件名:java.util.Collection のメソッドがサブインターフェースの List にもあるのはなぜ?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7753&forum=12

と同じ疑問だと思います。
その時は、みなさまからご回答をいただきましたが、私としては、絶対にそうである(余計に implements List している)必要はないけど、そうなっていても害もないので、なんとなくそうなっているだけで、という考えに落ち付きました。
cloy
会議室デビュー日: 2004/01/19
投稿数: 16
投稿日時: 2005-01-14 10:40
かずくんさん、unibonさん、返答ありがとうございます。
似たようなスレッドが既にあったのですね。そちらもすべて読ませていただきました。
簡単に言えば「ArrayListはListをimplementsしていることを明確にするため。」ということで納得できました。
あちらのスレッドでかずくんさんが引用されているように、Joshua Blochの言う「実装の継承とインタフェースの継承の分離」ですね。

自分で設計したクラスでも、
例えばAというインタフェースを作成したら、このAをimplementsしたBという抽象クラスを作成して、Cという具象クラスを作る。
というパターンは往々にしてあると思いますが、このときも同様にCクラスはAインタフェースをimplementsするように書くべきなのでしょう。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)