- PR -

ジェネリックコレクションのメソッドの引数の型

1
投稿者投稿内容
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2006-10-30 23:00
引数の型として、パラメータ型が用いられてもよそそうな箇所で
Object型が用いれている箇所があります。

例としてMap<K,V>をあげれば、
get(K key) containsValue(V value)
ではなく
get(Object key) contains(Object value)
のように定義されたメソッドがあります。
確かに引数がコレクションに追加されるメソッドではないので
Object型でも問題ないのですが、KではなくObjectである強い理由ってあるのでしょうか?それともどちらでもよいけど、とりあえずObject型にしておいたという感じなのでしょうか?

ちなみにC#では同種のメソッドの引数は
Get(Tkey key)  ContainsValue(TValue value) 
というようにパラメータ型が使われています。
C#(ドットネット)はジェネリクを実行環境にまで持っていっているので
一概に比較はできないとは思いますが。

大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2006-10-31 00:03
実際のところジェネリック使ったことなかったりします
思うに.NETが辿った道を追っているのではないですかね。
取り合えずというよりまだというところではないでしょうか。
ジェネリック実装自体Tigerからですし、互換性を考慮して
タイミングを見ているのでは?と考えます。

DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2006-10-31 07:46
暁さん、返信ありがとうございます。

引用:

暁さんの書き込み (2006-10-31 00:03) より:
実際のところジェネリック使ったことなかったりします



5.0は私のところも最近使いそうな気配でして、ぼちぼち調べている感じです。
しかし5.0でも普及していると思えないのに、すでに6.0の影があるんですね。

引用:

思うに.NETが辿った道を追っているのではないですかね。


ジェネリックは別として、Java1.4とC#1.1の差より、Java5.0とC#2.0の差はだいぶなくなったと思います。
Enum、拡張for文、アノテーションなんかは、C#1.0にあったEnum、foreach、属性と使い方はほぼ同じですし。あとはJavaでもswitchで文字列が使えるとうれしいです。

[ メッセージ編集済み 編集者: DSCH 編集日時 2006-10-31 08:06 ]
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2006-10-31 10:28
Object#equals()を利用したいだけなので、単に、get(Object key)も、containsValue(Object value)も、型を縛る必要がないからじゃないですか ?

入力用の put()、putAll() が型指定されていますから、get()、containsKey()、containsValue() の時点では整合性は取れている「はずだ」という見方もできますね。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2006-10-31 23:11
引用:
5.0は私のところも最近使いそうな気配でして、ぼちぼち調べている感じです。
しかし5.0でも普及していると思えないのに、すでに6.0の影があるんですね。


私は業務ではいまだ1.4なのです。5(1.5って書きそうになった)に使いたいクラスは結構あるのですが……
6ですか……学習用途にはTiger使っているもののいまだ使いこなせてもいないのに

引用:
ジェネリックは別として、Java1.4とC#1.1の差より、Java5.0とC#2.0の差はだいぶなくなったと思います。


最近のIT系マイブームがC#2.0です。javaに近いといわれつつ理解にはいまだ遠いですが。
文字列でswitchは……う〜ん、厳しそう。
自分は以前switch true {case 条件式}と記述できればいいななどと思ったことがあります
(確かそのとき文字列比較がしたかった)ので気持ちはわかるのですが。
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2006-11-01 19:57
引用:

びしばしさんの書き込み (2006-10-31 10:28) より:
Object#equals()を利用したいだけなので、単に、get(Object key)も、containsValue(Object value)も、型を縛る必要がないからじゃないですか ?


確かにソースコードを見るとObject#equals()を利用していますね。
引数をKにしたから特にうれしいことがあるかと言われてもないですし。
.NETだとKが値型の場合ボックス化が不要になってうれしいみたいです。
ご丁寧にもKがIEqualable<K>インタフェース持ちなら、
Equals(Object arg)ではなくEquals(K arg)を呼ぶ仕様になっています。

引用:

暁さんの書き込み (2006-10-31 23:11) より:
最近のIT系マイブームがC#2.0です。javaに近いといわれつつ理解にはいまだ遠いですが。


私もJava5.0とC#2.0を平行して勉強しているところです。
C#2.0のリフレクションでのジェネリックの概念が複雑すぎで参ってます。
ジェネリック型、ジェネリック型定義、オープン構築型、クローズ構築型、ジェネリック型パラメータ、ジェネリック型引数・・・要素型がジェネリック型定義の配列はオープン構築型には当たるがジェネリック型でないとか言われても頭痛がするだけです。



[ メッセージ編集済み 編集者: DSCH 編集日時 2006-11-01 19:59 ]

[ メッセージ編集済み 編集者: DSCH 編集日時 2006-11-01 23:16 ]
1

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