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

Tags: 言語