[1903] Re:オーバーライド時の共変、反変について
投稿者:(ぱ)こと管理人
2015/02/25 03:35:46
>Javaだとこの場合ははオーバライドにはならないで、オーバーロード、
>引数型が違う同名の別メソッドが増えただけと見なすことでガードするという実装なんですね。
こう言っては何なのですが、たぶんこれはJavaを「買いかぶりすぎ」だと思うのです。
引数については、反変はOK、共変はNG、
戻り値については、共変はNG、反変はOK
なのですが、
JDK1.4までのJavaでは、
引数については、型が違えばオーバーロード、
戻り値については、型が違えばコンパイルエラー
でした。戻り値については共変は許されるべきなのに、古いJavaではコンパイルエラーに
してしまっていたのです。
Javaでは、JDK1.5(Tiger)において、「共変戻り値」が許されるようになりました。
後になってこれを許すようになったということは、
当初は、共変とか反変とかそんなことはJavaの作者はあんまりまじめに考えていなくて、
後になって、共変戻り値はOKにすることができたけれど、反変引数は、既にそれを
オーバーロードという機能で使ってしまっていたためにOKにできなかったのではないか、
と思います。
メソッドオーバーロードがすごく便利だから反変引数を捨ててでもそちらを取った、
というのは言語設計者の選択肢として理解できますが(私はオーバーロードが便利だと
思わないのでその選択肢は取りませんが)、
本来使えるべき共変戻り値を当初エラーにしてしまっていた(しかも1.5でそれを
撤回した)というのは、あまりこう、ちゃんと考えた結果には見えないんですよねえ。