トップ «前の日記(2007-07-10 (Tue)) 最新 次の日記(2007-09-04 (Tue))» 編集   RSS 1.0 FEED  

Journal InTime


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>を渡せるわけだけど、そういう書き方は一般的なのかなあ。