Generics

12014 ワード

ギネス世界記録


  • コンパイル時にタイプをチェックする機能:compile-time type check

  • オブジェクトのタイプ安定性を提供します.(防止クラスCastException)

  • タイプチェックと成形遷移を省略できるため、コードを簡略化します.

  • ランタイムエラー、ランタイムエラーをCompile-timerrorに変換する方法そこから作られたのはギネス世界記録です.ClassCastException(Runtime error)をGenericsにドラッグします.
  • // Tv 객체만 저장할 수 있는 ArrayList 생성
    ArrayList<Tv> tvList = new ArrayList<Tv>();	// 타입변수 E 대신에, 실제 타입 Tv 대입
    
    tvList.add(new Tv()); // ok
    tvList.add(new Audio()); // 컴파일 에러. Tv 외 다른 타입 저장 불가
    
    // 장점
    ArrayList tvList = new ArrayList();
    tvList.add(new Tv());
    Tv t = (Tv) tvList.get(0);	// Tv - Object 간 타입 불일치로, 형변환 필요
    
    // ↓ 아래와 같이 간소화 가능
    ArrayList<Tv> tvList = new ArrayList<Tv>();
    tvList.add(new Tv());
    Tv t = tvList.get(0);  // 형변환 불필요 : 반환타입이 Tv 이기 때문. (타입 일치)

    タイプ変数


  • ムカデクラスを作成する場合は、オブジェクトタイプではなくタイプ変数(E)を使用します.

  • Objectを含むクラスのほとんどがGenericクラスに変更されました.

  • オブジェクトを作成する場合は、タイプ変数Eではなく実際のタイプを指定する必要があります(インポート)

  • タイプ変数ではなく実際のタイプを指定する場合は、シェイプ変換を省略できます.
  • ギネス世界記録用語


  • Box:ギネス世界記録.TのBoxまたは、T Boxと呼ばれる.「型変数T宣言」

  • T:タイプ変数またはタイプパラメータ.(Tはタイプ文字)

  • Box:オリジナルタイプ(オリジナルタイプ).通常レベル時のタイプ.元のタイプ
  • // 지네릭 클래스 선언
    class Box<T> {}
    
    //    ↓   지네릭 타입 호출   ↓  : 타입이 서로 일치해야 함.
    Box<String> b = new Box<String>();
    //	 ↑ 대입된 타입 (매개변수화 된 타입) : 생성할 때마다, 다른 타입을 넣을 수 있음.
    

    ムカデ型の多形性

  • 参照変数とコンストラクション関数の置換タイプは一致する必要があります.
  • //    ↓ 지네릭 타입 호출 ↓  : 타입이 서로 일치해야 함.
    Box<조상> b = new Box<자손>(); 	// 이렇게는 안됨! 에러남!! 반드시 일치해야 됨.
  • ギネス世界記録類間の多形性は成立している.
  • (タイプは一致する必要があります)
    List<Tv> list = new ArrayList<Tv>();	// OK. 다형성. ArrayList가 List 구현
    
    List<Tv> list = new LinkedList<Tv>();	// OK. 다형성. LinkedList가 List 구현
  • パラメータの多形性も
  • に成立する.
    class Product {}
    class Tv extends Product {}
    class Audio extends Product {}
    
    ArrayList<Product> list = new ArrayList<Product>();
    
    list.add(new Product());
    list.add(new Tv());		// Product의 자손도 add 가능.!
    list.add(new Audio());
    
    // add method 상황 설명
    boolean add (E e) {...} 
    -> 
    boolean add(Product e) {...}
    //		       ↑ 다형성에 의해, Product와 그 자손 객체가 오는 것이 가능하다.
    
    
    // get method도 같다
    E get(int index) {...}
    ->
    Product get(int index) {...}	// get의 반환 타입이 Product임.
    
    Product p = list.get(0);
    Tv t = (Tv) list.get(1);	// Product를 반환하므로, Tv로 형변환 필수

    Iterator<E>

  • クラスを作成する場合は、オブジェクトタイプ
  • の代わりに「タイプ変数」(Tなど)を使用します.
    public interface Iterator<E> {
    	boolean hasNext();
        E next();	// 원래 iterator는 object를 반환해서, 형변환이 필요했음
        void remove();
    }

    HashMap<K, V>

  • の複数のタイプの変数が必要な場合は、カンマ(,)を区切り記号として宣言します.
  • //		  key	 value
    HashMap<String, Student> map = new HashMap<String, Student>();
    map.put("자바왕", new Student("자바왕",1,1,100,100,100)); 

    限られたギネス類


  • extendsを使用すると、代入可能なタイプを制限できます.

  • インタフェースの場合、extendsも使用する必要があります.
  • // 인터페이스도 타입 제한에서는 extends를 씁니다.
    interface Eatable {}
    class FruitBox<T extends Eatable> {}
    
    class FruitBox<T extends Fruit> {	// Fruit의 자손 type만 대입 가능
    	ArrayList<T> list = new ArrayList<T>();
        ...
    }
    
    FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK
    FruitBx<Toy>	toyBox = new FruitBox<Toy>();	  // Error. Toy는 Fruit의 자손이 아님.

    ギネス世界記録の制限


  • タイプ変数の代入は、インスタンスによって異なります.
    Box appleBox = new Box<>();保管可能//APpleオブジェクトのみ
    Box grapeBox = new Box<>();//グラフィックオブジェクトのみを保存

  • タイプ変数はStaticメンバーには使用できません
    Static:すべてのインスタンスが共通であるため、各インスタンスに対して設定できるタイプ変数は使用できません.

  • オブジェクトまたは配列を作成する場合、タイプ変数は使用できません.(new演算子の後のタイプは「OK」でなければなりません.Tは不確定なので使用できません!=new演算子の後ではTを使用できません!)

  • タイプ変数を使用してアレイを宣言できます.
  • class Box<T> {
    	static T item;  // 에러
        static int compare(T t1, T t2) { ... } // 에러
    }
    
    class Box<T> {
    	T[] itemArr;	// OK. T 타입 배열을 위한 참조 변수
        ...
        T[] toArray() {
        	T[] tmpArr = new T[itemArr.length];	// 에러. 지네릭 배열 생성불가
        }
    }

    ワイルドカード<?>


  • 別のオブジェクトを参照できる代替タイプの参照変数

  • < ? extends T>:ワイルドカードの上限制限.Tと彼らの子孫だけがこれを主に使うことができる!

  • < ? extends T>:ワイルドカードの制限.Tとその祖先だけが

  • < ? > : 制限なし.すべてのタイプが可能です.と同じ

  • メソッドのパラメータはワイルドカードで使用できます
  • // 대입된 타입이 일치하지 않아도 ok
    // 참조변수 하나로 대입된 타입이 여러개가 될 수 있도록 유연하게 만들어줌
    ArrayList<? extends Product> list = new ArrayList<Tv>();  // ok
    ArrayList<? extends Product> list = new ArrayList<Audio>();  // ok
    
    ArrayList<Product> list = new ArrayList<Tv>();  // 에러. 대입된 타입 불일치
    
    // ex
    static Juice makeJuice(FruitBox<? extends Fruit> box) { ... }
    
    // 둘다 가능
    Juicer.makeJuice(new FruitBox<Fruit>()));
    Juicer.makeJuice(new FruitBox<Apple>()));

    ギネス世界記録


  • ギネスタイプを宣言する方法(タイプ変数はメソッドでのみ有効)
    static < T > void sort(List< T > list, Comparator< ? super T > c)

  • クラスのタイプパラメータとメソッドのタイプパラメータは異なります.
  • class FruitBox<T> {
    	...
    	static <T> void sort(List<T> list, Comparator<? super T> c) {
    	...
    	}
    }