30分で分かる!初心者からはじめる共変・反変講座

こんなことも分からずに技術者をやっていますが、TLの皆さんのおかげで私は今日も元気です。
2
安心沢ガブ美 @gab_km

@cocoatomo ふむー、この場合は継承構造の中で迷子になってしまうんでしょうか。確かに、引数の型がサブクラスに制限されるとオーバーライド元の関数が意味を成さなくなりますね。

2011-11-15 00:36:37
tomo🐧@learning @cocoatomo

@gab_km 「迷子」と言いますと, どういったことでしょうか?

2011-11-15 00:40:15
安心沢ガブ美 @gab_km

@cocoatomo あー、すいません。実装クラスを探すときに、メソッドの引数や戻り値の型から「これだ!」という実装クラスを見つけられなくなる様を想像しました。

2011-11-15 00:45:55
tomo🐧@learning @cocoatomo

@gab_km なるほど, 確かにそうですね. なので, Override アノテーションを付けておくと javac が勝手に判定してくれます.

2011-11-15 00:49:38
安心沢ガブ美 @gab_km

@cocoatomo そのようですね。一方、C# はoverrideキーワードを付けても共変戻り値のメソッドが書けないらしくて、そういうやり取りを見てさっきのツイートだったのです。

2011-11-15 00:55:30
tomo🐧@learning @cocoatomo

@gab_km C# 4.0 で入った in, out で反変, 共変が表現できるようですね. これは interface に対してだけかもしれませんが, よく分かりません…… (C# を知らない.)

2011-11-15 01:02:48
安心沢ガブ美 @gab_km

@cocoatomo あー、そのようですね。と曖昧な言い方になってしまうんですが、私自身これを使わなくてはいけない場面に遭遇してこなかったので…^^;

2011-11-15 01:07:29
tomo🐧@learning @cocoatomo

@gab_km in, out にしてくれた方がどっちが共変でどっちが反変がすぐに分かるので有難いです. Java だと extends と super なんで一瞬では判別付きません…… in, out を直接書く人はそこそこのサイズの継承ツリーを作る人でしょうね.

2011-11-15 01:09:26
安心沢ガブ美 @gab_km

@cocoatomo あー、確かに。さらにインターフェイスやデリゲートでないと使えないそうなので、大き目のクラス階層を見通す必要がある人が書いてそうですね。

2011-11-15 01:15:51

思ったこと

安心沢ガブ美 @gab_km

TL上の各方面から、共変・反変について個人授業を受けている #五年前の自分に教えても嘘乙wwwwwwって言われそうなこと

2011-11-15 00:38:11
安心沢ガブ美 @gab_km

だいぶ分かってきた気がする。サブクラスがオーバーライドしたメソッドについて、引数の型が強くなる、戻り値の型が弱くなる、それはオーバーライド元のメソッドからみてどうなのか。

2011-11-15 00:43:06

おまけ

安心沢ガブ美 @gab_km

(「反変」………きょーへん………覚えましたし)

2011-11-15 00:58:15
ぐるぐる系SQL @bleis

(「共変」……はんぺん……覚えましたし)

2011-11-15 01:00:04