内容へ移動
Cat Paw Software
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
トレース:
java:covariant
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== 共変(covariant) ====== ===== 共変の戻り値 ===== Java5からメソッドをオーバーライドするとき、戻り値の型を変更することが可能になった。 共変戻り値はcloneメソッドで最もよく利用される。 <code java> public interface Cloneable{ public Object clone(); } public class CloneableImpl implements Cloneable{ public CloneableImpl clone() { try { return (CloneableImpl)super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage()); } } } </code> CloneableImplはObjectの一つであるので、''CloneableImpl clone();''はObjectを返しているのと同義つまり、このメソッドは''Object clone();''と同等であると言える。 ===== 配列とcovariant ===== 配列はcovariantである。IntegerはNumberであり、Integer[]はNumber[]である(共変) <code java> Number[] n = new Integer[]{ 1, 2, 3 }; // Integer[]は、Number[]であるので代入できる。 n[0] = Double.valueOf(0d); // コンパイルエラーにならないが実行時例外(ArrayStoreException) </code> これはJava言語設計の失敗とも言われている。covariantは戻り値のようにgetするものに対しては安全だが、setする場合に危険。 ===== ジェネリクスとcovariant ===== 配列の反省を受けて(?)ジェネリクスはcovariantではない。IntegerはNumberであるが、List<Integer>はList<Number>ではない。 <code java> ArrayList<Number> i = new ArrayList<Integer>(); // コンパイルエラー </code> これは以下のようなコードを許可しないためと思われる <code java> ArrayList<Number> i = new ArrayList<Integer>(); i.add(Long.valueOf(1)); </code> 配列では以下のソースがコンパイル可能で、実行時エラーになる。 <code java> Number[] i = new Integer[1]; i[0] = Long.valueOf(1); // 実行時エラー(ArrayStoreException) </code>
java/covariant.txt
· 最終更新:
2011/06/23 06:02
by
nullpon
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
文書の先頭へ