- PR -

java.util.Collection のメソッドがサブインターフェースの List にもあるのはなぜ?

投稿者投稿内容
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-11-29 17:18
引用:

H2さんの書き込み (2003-11-28 11:09) より:

おそらく、List と Collectionの概念の違いのためだと思います。Collectionはフレームワークの一番基礎となっている部分です。Collectionはとても抽象化されていて、コレクションにオブジェクトをaddしたりするのはListやSetにaddするのとは違う意味を持つような気がします。

Sub-interfaceがSuper-interfaceのメソッドと同じメソッドを宣言するのはOverrideです。つまり、すでに宣言されているメソッドをOverrideすることにより「同じメソッド名だけど実際の意味はちょっと違いますよ」というのを強調している感じがします。意識的にしろ、無意識的にしろ、設計者の意図はそういった概念的なものではないでしょうか。実際SetもCollectionのメソッドをOverrideしています。

2番目の型の冗長ですが、これも概念的なものだと思います。おそらく、ArrayListはそれ自体がListの実装であり、冗長な型宣言をすることでArrayListはListとより近いものであると言っているよう気が私はします。もしArrayListがListを直接implementしなかった場合、ArrayListはAbstractListのサブクラスのような印象を受けますが、冗長的な宣言をすることにより、ArrayListはListであると強調している感じがします。


私もいろいろと推察してみたところ、H2 さんと同じような見解になりました
#私も確信はないですけど。。。^^;

1 番目については、List や Set が Collection のメソッドをオーバーライドすることによって、
より具体的な意味(振る舞い)を持たせようとしているのだと思われます。
#でも、その本当の目的はやはり Javadoc として出力することにあるのかなぁ?

2 番目については、ArrayList が AbstractList の拡張と言うよりは
List のより完全な実装であるということを強調したいだけかも知れません。
#特に大した意味はないと思われます。別にあってもなくても困ることはないでしょうから


[ メッセージ編集済み 編集者: 架空兎 編集日時 2003-11-29 18:45 ]

[ メッセージ編集済み 編集者: 架空兎 編集日時 2003-11-30 19:59 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-12-01 13:39
unibon です。こんにちわ。

質問者なのですが回答者になって気づいたことを書き足しますと、
メソッドの冗長さ(1)と、型の冗長さ(2)については、どちらも、
javap でクラスファイルを覗いて見ると、
冗長さが残ったままになる(ソースコード上だけの冗長さではなく、
バイトコード中でも冗長さが残る)ようです。
そのため、もしかしたら VM の作りによっては、
これにより速さが違ったりする可能性もあるのかも、とふと思いました。
#速くなる?遅くなる?違わない?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-12-02 10:52
unibon です。こんにちわ。

引用:

架空兎さんの書き込み (2003-11-29 17:18) より:
1 番目については、List や Set が Collection のメソッドをオーバーライドすることによって、
より具体的な意味(振る舞い)を持たせようとしているのだと思われます。
#でも、その本当の目的はやはり Javadoc として出力することにあるのかなぁ?

2 番目については、ArrayList が AbstractList の拡張と言うよりは
List のより完全な実装であるということを強調したいだけかも知れません。
#特に大した意味はないと思われます。別にあってもなくても困ることはないでしょうから


架空兎さんがまとめられていたので便乗しますが、
私もこの考えに収束しました。
みなさまありがとうございます。

とくに(2)については、たとえば Eclipse で、List を選択して、
検索→参照、あるいは、検索→インプリメンター、
を実行した場合、もし ArrayList が List を implements していないと、
検索結果に ArrayList が現れなくなってしまう(ので使いづらい)ことに気づきました。

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