2007-07-13 (Fri) [長年日記]
_ Java Genericsに見るvariance
20070710のみずしまさんのコメントより:
Java Genericsでは型のユーザがvarianceを指定できるように なっています。
ほう。 そういえば、最近のJavaはcovariant return typeもサポートしているそうですね。
型パラメータを? extends Tという形で記述することによって、 covariantな型になります。 List<Integer> ints = new ArrayList<Integer>(); ints.add(1); List<? extends Number> nums = ints; // OK nums.add(2); // NG
なるほど、面白い。 一瞬型安全じゃないのではと思ったのですが、配列の時のように実 行時にArrayStoreExceptionのような例外が発生するわけではなく、 コンパイル時にエラーになるんですね。
でもList<? extends Number>がList<Number>とcompatibleでない(null以外のaddができないので当然)のが、使い勝手的にどうなんだろう。 参照しかしない部分では(List<Number>ではなく)List<? extends Number>を要求するようなインタフェイスにするというスタイルでコーディングすれば、List<Integer>を渡せるわけだけど、そういう書き方は一般的なのかなあ。