2005-08-21 [長年日記]
λ. ジェネリクス・クイズ
これは型変数のvarianceの問題。JavaのArrayListでは型変数が正の位置と負の位置の両方に現れるため、ArrayListはこの型変数についてcovariantかつcontravariantでなくてはならず、結果として型変数はどちらの向きにも変化できない。よって、StringとObjectの関係をArrayList<String>とArrayList<Object>の関係にliftすることは出来ない。
もし、型変数が正の位置にしか現れないのであれば ArrayList<String> IS-A ArrayList<Object> として問題ないし、負の位置にしか現れないのであれば ArrayList<Object> IS-A ArrayList<String> として問題ない。
(追記) 正負の位置は鷲見さんの考えで合ってます。単に「関数の戻り値と引数」と書かないのは、負の位置では正負が反転するので、そこに関数型があるとそこでは対応が逆になるから。例えば「(A -> B) -> C」という型では、A,Cが正の位置で、Bが負の位置。
そういうことでしたか。テクニカルタームは一見、単純に言い換えられるようで(ならば…と、私のような素人にはモヤモヤしたものになりがちなのですが、じつは)そうでないところが、深いですねぇ…。勉強になります。ありがとうございました。