30分で分かる!初心者からはじめる共変・反変講座
@cocoatomo ふむー、この場合は継承構造の中で迷子になってしまうんでしょうか。確かに、引数の型がサブクラスに制限されるとオーバーライド元の関数が意味を成さなくなりますね。
2011-11-15 00:36:37@cocoatomo あー、すいません。実装クラスを探すときに、メソッドの引数や戻り値の型から「これだ!」という実装クラスを見つけられなくなる様を想像しました。
2011-11-15 00:45:55@gab_km なるほど, 確かにそうですね. なので, Override アノテーションを付けておくと javac が勝手に判定してくれます.
2011-11-15 00:49:38@cocoatomo そのようですね。一方、C# はoverrideキーワードを付けても共変戻り値のメソッドが書けないらしくて、そういうやり取りを見てさっきのツイートだったのです。
2011-11-15 00:55:30@gab_km C# 4.0 で入った in, out で反変, 共変が表現できるようですね. これは interface に対してだけかもしれませんが, よく分かりません…… (C# を知らない.)
2011-11-15 01:02:48@cocoatomo あー、そのようですね。と曖昧な言い方になってしまうんですが、私自身これを使わなくてはいけない場面に遭遇してこなかったので…^^;
2011-11-15 01:07:29@gab_km in, out にしてくれた方がどっちが共変でどっちが反変がすぐに分かるので有難いです. Java だと extends と super なんで一瞬では判別付きません…… in, out を直接書く人はそこそこのサイズの継承ツリーを作る人でしょうね.
2011-11-15 01:09:26@cocoatomo あー、確かに。さらにインターフェイスやデリゲートでないと使えないそうなので、大き目のクラス階層を見通す必要がある人が書いてそうですね。
2011-11-15 01:15:51思ったこと
だいぶ分かってきた気がする。サブクラスがオーバーライドしたメソッドについて、引数の型が強くなる、戻り値の型が弱くなる、それはオーバーライド元のメソッドからみてどうなのか。
2011-11-15 00:43:06おまけ