21.01.19-40日目


👸 Generics


コンパイル時にタイプをチェックできる
  • は、オブジェクトのタイプ安定性を向上する、変換の手間を低減する
  • である.
  • タイプのチェックと変換を省略できるため、コードは非常に簡潔である:
  • 🤴 タイプ変数

  • クラスを作成する場合は、オブジェクトタイプではなくタイプ変数(E)を使用します.
  • ex>
    public class ArrayList<E> extends AbstractList<E> {
    	private transient E[] elementData;
        public boolean add(E o) { /* 내용 생략 */}
        public E get(int index) { /* 내용 생략 */}
    }

    🤴 ギネス世界記録用語


    Box<T>  지네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽는다.
      T	타입 변수 또는 매개변수.(T는 타입 문자)
      Box	원시 타입(raw type)

    🤴 ムカデ型と多形性

  • 参照変数と構造関数の代入タイプは一致する必要があります.
  • ArrayList<Tv>	    list = new ArrayList<Tv>(); // 일치
    ArrayList<Product>  list = new ArrayList<Tv>(); // 불일치. 에러
  • ギネス世界記録類間の多形性は成立する(代入のタイプは一致しなければならない)
  • List<Tv>  list = new ArrayList<Tv>();  // OK. 다형성. ArrayList가 List를 구현
    List<Tv>  list = new LinkedList<Tv>(); // OK. 다형성. LinkedList가 List를 구현
  • パラメータの多形性も
  • に成立する.
    ArrayList<Product> list = new ArrayList<Product>();
    list.add(new Product());
    list.add(new Tv()); // Ok
    list.add(new Audio());  // Ok

    🤴 限られたギネス類

  • extendsは
  • を制限している.
    class FruitBox<T extends Fruit>{ // Fruit의 자손만 타입으로 지정가능
       ArrayList<T> list = new ArrayList<T>();
       ...
    }
    -
    FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK
    FruitBox<Toy> appleBox = new FruitBox<Toy>(); // 에러. Toy는 Fruit의 자손X.
  • インタフェースでもextends(implements Xを使用)
  • を使用できます.
    interface Eatable{}
    calss FruitBox<T extends Eatable> {...}

    🤴 ギネス世界記録の制限

  • 型変数は、異なるインスタンスで
  • を置き換えることができる.
    Box<Aapple> appleBox = new Box<Apple>(); // Ok. Apple객체만 저장가능
    Box<Grape> appleBox = new Box<Grape>(); // Ok. Grape객체만 저장가능
    タイプ変数は、
  • 静的メンバーには使用できません.
    (静的メンバーはすべてのインスタンスで共通)
  • 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]; // 에러. 지네릭 배열 생성불가
                					// new 연산자 다음에 T 쓸 수 없다.
        }
    }

    🤴 ワイルドカード<?>

  • 参照変数が表すタイプは、他のオブジェクトを参照できます.<? extends T>ワイルドカードの上限制限.Tとその子孫だけを許す<? super T> ワイルドカードの下限.Tとその祖先だけが<?> に制限はありません.すべてのタイプが可能です.と同じ
  • ex>
    ArrayList<? extends Product> list = new ArrayList<Tv>(); // Ok
    ArrayList<? extends Product> list = new ArrayList<Audio>(); // Ok
    ArrayList<Product> list = new ArrayList<Tv>(); // 에러. 대입된 타입 불일치
  • メソッドのパラメータにワイルドカード
  • を使用する

    🤴 ギネス世界記録

  • ギネスタイプを宣言する方法(タイプ変数はメソッドでのみ有効)static <T> void sort(List<T> list, Comparator<? super T> c)
  • クラスタイプパラメータ<T>とメソッドタイプパラメータ<T>はそれぞれ
  • である.
    class FuritBox<T>{ // 지네릭 클래스
    	...
        static<T> voic sort(List<T> list, Comparator<? super T> c){ // 지네릭 메서드
        }
    }
  • メソッドが呼び出されるたびにタイプ(多くの場合省略)
  • を入力必要がある.
  • メソッドを呼び出す場合、タイプを省略しないとクラス名
  • は省略できない.

    🤴 ムカデ形変換

  • ギネスタイプと元のタイプとの間の変換は望ましくない(警告を生成する)
  • Box<Object> obj = null;
    Box box = (Box)objBox; // Ok. 지네릭 타입 -> 원시 타입. 경고발생
    objBox = (Box<Object>)box; // OK. 원시 타입 -> 지네릭 타입. 경고발생
  • ワイルドカードタイプはGenericタイプ
  • に変換可能

    🤴 ムカデタイプの除去

  • コンパイラはギネスタイプを削除し、必要な場所で変形します.
  • ギネスタイプの境界をクリア(bound)
  • ギネスタイプを削除した後、タイプが一致しない場合は、成形遷移を追加します.
  • ワイルドカードが含まれている場合は、適切なタイプの変換を追加します.
  • 👶 ソース


    JAvaの定式書&youtube