Generics


コンパイル時にタイプをチェックする機能
コンパイル時にタイプチェックを行うことができますが、その限界によって作成された概念
ArrayListにはオブジェクト配列があり、すべてのタイプのオブジェクトを格納できますが、特定のオブジェクトのみを保存したい場合は、そのリストはどうなりますか?オブジェクト以外のオブジェクトが配列に入った場合、どのようにキャプチャしますか?->Genericsの使用
//숫자만 넣고 싶은 ArrayList를 생성
ArrayList list = new ArrayList();
list.add(30);
list.add(20);
list.add("30"); 

//컴파일 시 잡아낼 수 없으며
//실행하면 형변환 에러 발생 ClassCastExecption(런타임예외)
//자식끼리 즉 형제 레벨 클래스끼리는 형변환 불가능
//Object -> Integer, String
Integer i = (Integer)list.get(2); 

ArrayList<Integer> list2 = new ArrayList<Integer>();
list.add(30);
list.add(20);
list.add("30");  //컴파일 에러 발생 
長所
1.オブジェクトのタイプ安定性を向上させる.
2.形変換を省略して、コードを簡潔にすることができます.
その他のまとめ
上で発生したClassCastExceptionは運転時異常です.ランタイム例外は、ランタイムで発生した例外ではなく、プログラマがエラーコンパイルしたものです.したがって、プログラムを実行する前に(コンパイル時間)実行時の異常をチェックするにはどうすればいいですか?この考えの結果の一つはギネスだ.コンパイル時にチェックできるように、コンパイルにタイプ情報を提供します.
ギネスレコードに加え、Stringタイプのオブジェクトをnullではなく「」に初期化するのも、ランタイム異常を防ぐためのNull PointExceptionです.

タイプ変数

  • クラスを作成すると、
  • を使用するためにオブジェクトタイプではなくタイプ変数を宣言します.
  • オブジェクトを生成する場合、タイプ変数(E)の代わりに実際のタイプを指定します.パラメータ呼び出し時にパラメータ
  • を挿入することに等しい
  • の実際のタイプを指定すると、形変換
  • を省略することができる.

    ムカデ型と多形性

  • 参照変数とジェネレータのタイプ変数は一致する必要があります.
  • ギネス世界記録類間の多形性成立
  • パラメータの多形性も
  • に成立する.
    List<TV> list = new ArrayList<Tv>();
    List<TV> list = new LinkedList<Tv>();
    
    ArrrayList<Product> list = new ArrayList<Product>();
    list.add(new Product());
    list.add(new Tv());

    限られたギネス類

  • extendsは
  • を制限している.
  • インタフェースもextendsを使用
    //클래스2 또는 클래스2의 자손만 타입으로 지정 가능하다.
    class 클래스명< T extends 클래스2> { 
        ...
    }
    
    //인터페이스와 클래스를 동시에 쓰려면 콤마가 아닌 &를 사용
    class 클래스명< T extends 클래스명(클래스) & 클래스명(인터페이스)> { 
        ...
    }

    ギネス世界記録の制限

  • 型変数には、
  • の異なるインスタンスを提供することができる.
  • したがって、タイプ変数は静的メンバー->すべてのインスタンスの汎用性
  • には使用できません.
  • 配列のタイプ変数は使用できません.タイプ変数はオブジェクトの宣言を生成するために使用できません.->新しい演算子

    ワイルドカード

  • は、異なるタイプの地理的オブジェクトを参照変数として参照する.
  • メソッドのパラメータも
  • で使用できます.
    ArrayList<Product> list = new ArrayList<Tv>(); //타입 불일치 에러 발생
    
    ArrayList<? extends Product> list = new ArrayList<Tv>();
    ArrayList<? extends Product> list = new ArrayList<Audio>();
    '<? extends T>":Tとその子孫のみ '<? super T>':Tとその祖先のみ '<?>: 制限なし。すべてのタイプが="<?extends Object>

    ギネス世界記録

  • ギネスブックタイプ宣言
  • クラスのタイプパラメータTとメソッドタイプパラメータTはそれぞれ
  • である.
  • メソッドを呼び出すたびに、異なるギネスタイプを置き換えることができます:
  • ワイルドカードを無効にするときによく使用される
  • class FruitBox<T> { //지네릭 클래스
    	//지네릭 메서드
    	static <T> void sort(List<T> list, Comparator<? super T> c)
    }

    ムカデ形変換

  • ギネスタイプと元のタイプとの間で変換できますが、警告
  • 異なるタイプの地理オブジェクト間でX
  • を変換する
  • ワイルドカードを使用するGenericタイプは、省略可能な
  • に変換することができる.
    FruitBox<? extends Fruit> fbox = new FruitBox<Fruit>();
    FruitBox<? extends Fruit> abox = new FruitBox<Apple>();
    //(FruitBox<? extends Fruit>) new FruitBox<Apple>()와 같음
    

    ムカデタイプの除去

  • コンパイラはギネスタイプを削除し、必要な場所で変形します.(低互換性)
  • リファレンス
    本ジャワの定式