My Photo

« タスクが実行時のエラー | Main | 詐欺か、運用の失敗か #kabu »

February 24, 2012

ジェネリクス(Generics)その3

型の互換性

List<Integer> list = new ArrayList<Integer>();

これはOK。List<Integer> と ArrayList<Integer>の関係は、1.4まで List と ArrayList の関係と同じ。

ArryaList<Integer> list = new ArrayList<Object>();  // コンパイルエラー

これはNG。ArryaList<Integer> と ArrayList<Object> の間にはスーパークラス/サブクラスの関係はない。

もし後者の代入が許されるとすると、
・宣言から、変数listの要素はInteger型しか許されない。
・変数listが実際に参照しているArrayList<Object>から、listにはObject型、つまりDobule型でもString型でも何でも要素として許される。
という矛盾が起こる。

ワイルドカード

要素の型が1つに決まっていないListを使いたい場合、型パラメータに?を与えて List<?> のように記述する。この?をワイルドカードと呼ぶ。

List<?> list;  // 要素の型は限定されない
Map<String, ?> map;  // 値の型は限定されない。

List<?>型の変数には List<Object> も List<Integer> も List<String> も、どの型の要素を持つListでも代入できる。

List<?> list;
list = new ArrayList<Object>();
list = new ArrayList<String>();
list = new ArrayList<Integer>();

ワイルドカードも extends と super で制限することができる。
extendsであれば指定したクラスとその子孫のクラス、superだと指定したクラスとその先祖のクラスに制限できる。
下記のコードにあるように、<C2>と<? extends C2> には違いがある。<C2> とした場合、型パラメータにはC2しか入れられない。C2のサブクラスを入れようとしてもコンパイルエラーとなる。

import java.util.ArrayList;
import java.util.List;

class C1 {};
class C2 extends C1 {};
class C3 extends C2 {};

public class Foo {
  public void method() {
    List<C2> list1;
    list1 = new ArrayList<Object>();  // コンパイルエラー
    list1 = new ArrayList<C1>();  // コンパイルエラー
    list1 = new ArrayList<C2>();
    list1 = new ArrayList<C3>();  // コンパイルエラー
    
    List<? extends C2> list2;
    list2 = new ArrayList<Object>();  // コンパイルエラー
    list2 = new ArrayList<C1>();  // コンパイルエラー
    list2 = new ArrayList<C2>();
    list2 = new ArrayList<C3>();
    
    List<? super C2> list3;
    list3 = new ArrayList<Object>();
    list3 = new ArrayList<C1>();
    list3 = new ArrayList<C2>();
    list3 = new ArrayList<C3>();  // コンパイルエラー
  }
}

参考記事:Java Press Vol.37 J2SE 5.0 実践チュートリアル

« タスクが実行時のエラー | Main | 詐欺か、運用の失敗か #kabu »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/54065049

Listed below are links to weblogs that reference ジェネリクス(Generics)その3:

« タスクが実行時のエラー | Main | 詐欺か、運用の失敗か #kabu »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof