トップ «前の日記(2005-08-20) 最新 次の日記(2005-08-23)» 月表示 編集

日々の流転


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が負の位置。

本日のツッコミ(全1件) [ツッコミを入れる]
ψ sumim (2005-08-23 10:15)

そういうことでしたか。テクニカルタームは一見、単純に言い換えられるようで(ならば…と、私のような素人にはモヤモヤしたものになりがちなのですが、じつは)そうでないところが、深いですねぇ…。勉強になります。ありがとうございました。