12.ギネス記録、列挙型、解説


1.ギネス(Generics)


1-1. ギネス世界記録


コンパイル時にタイプチェックを行う機能.クラス名の横に<>を付けて、特定のタイプのオブジェクトのみを含めることを指定します.
タイプセキュリティを向上させ、タイプ変換を省略し、コードを簡素化する利点があります.

1-2. クリーンアップ用語

class Example<T> {}
ギネスを適用したクラスをギネスクラス,Exampleをオリジナルタイプと呼ぶ.
<>のTはタイプ変数と呼ばれ、オブジェクトの作成時にタイプ変数に実際のタイプを指定する必要があります.指定したタイプ(タイプ変数ではなく)を「代替タイプ(パラメトリックタイプ)」と呼びます.

1-3. たけいせい


  • 参照変数で指定された、またはコンストラクション関数に指定された、またはコンストラクション関数に指定されたタイプは、常に一致する必要があります.
    Example<String> e = new Example<String>();
    Example<String> e2 = new Example<>(); // JDK 1.7부터 뒤에 지네릭 타입 생략 가능.

  • ムカデタイプではないクラス間の多形性が適用されます.パラメータの多形性も成立する.
    List<Fruit> list = new ArrayList<Fruit>();
    
    list.add(new Apple());
    list.add(new Orange());
  • 1-4. コレクション


    Iterator<E>

    public interface Iterator<E> {
      boolean hasNext();
      E next();
      void remove();
    }
    奇形器はギネスにも適用され、next()を使用する場合は変形を省略することができる.

    HashMap<K, V>


    HashMapのkeyとvalueタイプを指定できます.Kにkeyタイプ、Vにvalueタイプを指定します.get()keySet()values()等を使用する場合は、形変換を省略することができる.

    1-5. 限られたギネス類


    ギネス世界記録タイプでextendsを使用すると、特定のタイプの子孫の代入を制限できます.
    インタフェースを実装する必要がある制約も、実装ではなくextendsを使用します.
    class Example<T extends Fruit> {}
    特定のタイプの子であり、特定のインタフェースを実装クラスに制限している場合は、&を使用して接続します.
    class Example2<T extends Fruit & Eatable> {}

    1-6. 拘束

  • 型変数の場合、代入はインスタンスによって異なる場合があります.
  • 静的メンバーは、すべてのインスタンスに共通しているため、タイプ変数は使用できません.
  • ギネスタイプの配列を生成できません.参照変数のみ宣言できます.(new演算子はコンパイル時にタイプを正確に知る必要があるため)
  • 1-7. ワイルドカード


    ムカデ型に多形性を適用する方法がある.?を使用します.
    :Tとその子孫が代入できる
    :Tとその子孫が代入できる
    :制限なし.同一

    1-8. ギネス世界記録


    メソッド宣言子にギネスタイプを宣言するメソッド.
    static <T> void sort(List<T> list, Comparator<? super T> c)
    次の例では、クラスのタイプパラメータ<T>とメソッドタイプパラメータ<T>は、タイプ文字が同じだけで、異なる.
    ギネスメソッドのタイプパラメータは、メソッド領域でのみ有効です.したがって、元のstaticメンバーでタイプパラメータを使用することはできませんが、メソッドでギネスタイプを宣言できます.
    class FruitBox<T> {
      	...
      static <T> void sort(List<T> list, Comparator<? super T> c) {
        ...
      }
    }
    メソッドを呼び出すたびにタイプを代入する必要がありますが、ほとんどは省略できます.
    置換タイプを省略しない場合は、参照変数やクラス名を省略することはできません.
    ワイルドカードvsギネス世界記録
    ワイルドカード:1つの参照変数によって異なるタイプが置換された複数の地理オブジェクトを処理するために使用されます.
    Genericメソッド:メソッドを呼び出すたびに、異なるGenericタイプを置き換えることができます.

    1-9. ムカデ型転移

  • ギネスタイプと元のタイプとの間の変形は可能であるが、望ましくない.
  • は、異なるタイプのギネス世界記録の間で変形することはできません.
  • ワイルドカードのGenericタイプを使用して変換できます.
  • 1-10. ムカデの種類を削除


    コンパイラはギネスタイプを削除し、必要な場所で変形します.
    どうしたんですか.互換性が低いからです.(ギネスはJDK 1.5から導入されているので)

    プロセス


  • ムカデの境界を削除
    Genericタイプ<T>はObjectに変換される.下図<T extends Fruit>に示すように、制限を与えると、このタイプの最高祖先Fruitに置き換えられます.
    class Box<T extends Fruit> {  void add(T t) {...}}
    ⇩⇩
    class Box {  void add(Fruit t) {...}}

  • タイプが一致しない場合は、変形が追加されます.
    T get(int i) {  return list.get(i);}
    ⇩⇩
    Fruit get(int i) {  return (Fruit) list.get(i);}
    ワイルドカードが含まれている場合は、適切なタイプの変換が追加されます.
  • 2.列挙(enum)


    2-1. 列挙型


    関連する定数を一緒に置く.
    列挙型を定義するには、次のように記述します.
    enum 열거형이름 {상수명1, 상수명2, ... }
    列挙型を用いると,整数値を自動的にゼロから割り当てることができ,定数が多い場合には定数を簡単に宣言することができる.
    class Card {//  0       1      2       3  
    enum Kind { CLOVER, HEART, DIAMOND, SPADE }  
    enum Value { TWO, THREE, FOUR }    final Kind kind;  final Value value;}
    列挙型定数間の比較には、==およびcompareTo()を用いることができる.比較演算子(><)は使用できません.
    Javaは列挙定数の値とタイプをチェックするため、Kind.CLOVERValue.TWOを比較すると、値が0に等しくてもコンパイルエラーが発生します.

    2-2. 列挙型の祖先-java。lang.Enum


    java.lang.Enumはすべての列挙型の祖先である.

    方法


    メソッド説明クラスgetDeclaringClass()列挙型のクラスオブジェクトはString name()列挙型定数名を文字列としてint ordinal()列挙型定数定義を返す順序戻り(0から)TvalueOf(Class enumType,String name)列挙型列挙型戻りnameと一致する列挙型定数戻りを返します

    コンパイラが自動的に追加する方法


    メソッド説明値()列挙形式のすべての定数出力は、「値Of(String name)列挙形式定数」の名前を使用して文字列定数を参照できます.

    2-3. 列挙へのメンバーの追加


    不連続な列挙定数の場合、必要な値をかっこに書きます.カッコ()を使用するには、整数を格納するために新しいインスタンス変数と構造関数を追加する必要があります.(列挙された作成者は制御者によってプライベート)
    enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }

    3.コメント


    3-1. れいしん


    注釈のようにプログラミング言語に影響を与えることなく、有用な情報を提供します.
    プレゼンテーション説明@override overlightingメソッドかコンパイラチェック@Deprecatedを使用することを推奨しないフィールドまたはメソッドに貼り付ける@SuppressWarnings固有の警告メッセージ@SafeValargsムカデ行列タイプの可変パラメータ@Functional Interface関数インタフェース@Nativeメソッドが参照する定数を通知する前に上の↓では、標準アニメーション作成時に使用するアニメーション@Targetアニメーションを複数回使用できます@Documentedアニメーション情報はjavadocで作成したドキュメントに含まれる@Inheritatedアニメーションを継承@アニメーション保存範囲設定@Repeatableなどのアニメーションを保持@かに箱これらのアニメーションを組み合わせたコンテナアニメーション(valueというタイルタイプ要素を宣言する)をさらに定義する必要があります.

    3-2. アニメーションタイプの定義

    @interface 애너테이션이름 {  타입 요소이름();  ...}

    3-3. インパクトファクタ


    プレゼンテーションで宣言する方法
    プレゼンテーション要素は、プレゼンテーションを適用するときに指定され、実装する必要がない抽象的な方法です.
    補助要素にはデフォルト値を設定できます.アニメーションを適用するときに値が指定されていない場合は、既定値を使用します.
    ex)
    @interface DateTime {
      String yymmdd() default "991231"
      String hhmmss();
    }
    
    @DateTime(yymmdd = "211012", hhmmss = "093021")public class Example {}
    補助要素が1つしかなく、要素名がvalueの場合、要素を指定するときにその名前を省略できます.
    @interface ExampleAnno {  String value();}
    
    @ExampleAnno("hello")class Example {}
    要素タイプが配列の場合、カッコ{}を使用して複数の値を指定できます.値が1の場合、カッコは省略できます.

    タグの強化


    要素が定義されていないアニメーション.@Overrideが最も代表的だ.

    3-4. すべてのアニメーションの祖先


    すべてのアニメーションの祖先はAnnotationというインタフェースです.継承は許可されませんが、Annotationインタフェースで定義されたメソッドを呼び出すことができます.
    package java.lang.annotation;
    
    public interface Annotation {
      boolean equals(Object obj);
      int hashCode();
      String toString();
      Class<? extends Annotation> annotationType();
    }

    3-5. プレゼンテーション要素のルール


    宣言要素を宣言するときに守らなければならないルール
  • 要素のタイプは、基本タイプ、String、enum、プレゼンテーション、Class
  • のみです.
    パラメータ
  • ()内でパラメータ
  • を宣言できません.
  • 例外宣言不可
  • 型パラメータ
  • として定義できません.
    次の場合にエラーが発生します.
    @Interface WrongAnno {
      String test1(int i);
      String test2() throws Exception;
      ArrayList<T> list();
    }