JAVA Generic


이 포스팅은 자바의 신 1,2권의 내용으로 포스팅 되었습니다. 

概要

  • javaのGenericは、グラフィックを変換する際に発生する可能性のある問題を事前に解消するために作成された(Java 5から提供される)
  • は、
  • の機能を提供し、様々なタイプのオブジェクトを処理するための方法またはCollectionクラスにコンパイルされたときに타입체크を提供する.
  • クラスのデータ型は、以降のインスタンス化時に
  • と決定する.

    実施方法


  • public classクラス名{...}

  • 共通インタフェースインタフェース名{...}

  • Javaのすべてのクラスの最上位の親はObjectクラスであるため、任意のタイプのオブジェクトをwrapperTypeオブジェクトでデフォルトのデータ型にすることができます.
  • インプリメンテーション

  • ViewrainDefault.java
  • public class ViewrainDefault {
        private Object object;
        public Object getObject() {
            return object;
        }
        
        public void setObject(Object object) {
            this.object = object;
        }
    }
  • Main.java
  • public class Main {
        public static void main(String[] args) {
            ViewrainDefault vd = new ViewrainDefault();
            vd.setObject("제네릭");
            String str = vd.getObject();
            System.out.println(str);
        }
    }
    以上の場合はMainです.Javaでコンパイルエラーが発生しました.

  • すなわち,オブジェクトを特定のデータ型に明確化しなければならない.
  • String str = (String)vd.getObject(); 一緒にキャッシュしてもエラーは発生しません

  • ViewrainGeneric.java
  • public class ViewrainGeneric <T> {
        private T t;
        public T getObject() {
            return t;
        }
        public void setObject(T t) {
            this.t = t;
        } 
    }
  • Main.java
  • public class Main {
        public static void main (String[] args) {
            ViewrainGeneric<String> vg = new ViewrainGeneric<String>();
            vg.setObject("제네릭");
            String str = vg.getObject();
            System.out.println(str);
        }
    }
    強制タイプ変換は発生しません.
  • (インスタンス化時)は、ViewRainGeneric Stringタイプとして指定されます.
  • では、クラス内でtjericタイプが自動的にStringに再構築されます.
  • n/a.理由


    Genericがない場合は、データ型の新しいクラスまたはメソッドを作成する必要があります.

  • setObjectメソッドを呼び出すと仮定する場合は、データ型ごとにメソッドを実装する必要があります.うううううう

  • 重複コードを節約し、コードの再利用性を高めるなどの利点があり、使いやすいです.
  • 別の例

    import java.io.Serializable;
    
    public class CastingDTO {
        private Object object;
    
        public void setObject(Object object){
            this.object = object;
        }
    
        public Object getObject(){
            return object;
        }
    }
  • のCastingDTOのGenericSampleを使用します.Java
  • の作成
    public class GenericSample {
        public static void main(String[] ar){
            GenericSample ex = new GenericSample();
            ex.checkCastingDTO();
        }
    
        public void checkCastingDTO(){
            CastingDTO dto1 = new CastingDTO();
            dto1.setObject(new String());
            
            CastingDTO dto2 = new CastingDTO();
            dto2.setObject(new StringBuffer());
            
            CastingDTO dto3 = new CastingDTO();
            dto3.setObject(new StringBuilder());
            {... 생략 }
            String temp1 = (String)dto1.getObject();
            StringBuffer temp2 = (StringBuffer)dto2.getObject();
            StringBuilder temp3 = (StringBuilder)dto3.getObject();
        }
    
        public void checkDTO(CastingDTO dto){
            Object tempObject = dto.getObject();
            if(tempObject instanceof String){
                System.out.println("String dto");
            }else if(tempObject instanceof StringBuffer){
                System.out.println("StringBuffer dto");
            }else if(tempObject instanceof StringBuilder){
                System.out.println("StringBuilder dto");
            }
        }
    }

  • dto 1,2,3オブジェクトsetObject()を使用してオブジェクト値を設定する

  • しかし、temp 1,2,3はdto 1,2,3に代入された...この場合、オブジェクトオブジェクトはString、StringBuffer、StringBuilderであるため、Catingを行う必要があります.
  • オブジェクトが3つあるので(このように選択します)、しかし...多くなると頭が痛くなります.

  • また、dto 2がStringBufferなのかBuilderなのかが混同されたら、どうすればいいのでしょうか.毎回instanceofを使うわけにもいかない...この時、ジェニーン・リックはとても役に立ちました.

  • CastingGenericDTO.java
  • import java.io.Serializable;
    
    public class CastingGenericDTO<T> implements Serializable {
        private T object;
    
        public void setObject(T obj){
            this.object = obj;
        }
    
        public T getObject(){
            return object;
        }
    }
    宣言
  • クラスの場合、クラス名には「T」が追加され、タイプ名を記入する場所でも「T」が対象となります.
  • GenericSample2.java
  • public class GenericSample2 {
        public static void main(String[] ar){
            GenericSample2 ex = new GenericSample2();
            ex.checkGenericDTO();
        }
    
        public void checkGenericDTO(){
            CastingGenericDTO<String> dto1 = new CastingGenericDTO<String>();
            dto1.setObject(new String());
            CastingGenericDTO<StringBuffer> dto2 = new CastingGenericDTO<StringBuffer>();
            dto2.setObject(new StringBuffer());
            CastingGenericDTO<StringBuilder> dto3 = new CastingGenericDTO<StringBuilder>();
            dto3.setObject(new StringBuilder());
    
            String temp1 = dto1.getObject();
            StringBuffer temp2 = dto2.getObject();
            StringBuilder temp3 = dto3.getObject();
        }
    }
  • の前の例で説明したように、オブジェクトをインスタンス化するときにタイプが宣言されています.
  • ジェニーリックタイプの名前

  • と書かれている部分は実は何でも使えます.しかし、開発者の会議は必ず存在します.ジェニーン・リックも使用しています.
  • E:要素
    K:鍵
    N:数字(番号)
    T:タイプ(Type)
    V:値(Value)
    S、U、V:第2、第3、第4のタイプ

    ジェニーリックのWildCardタイプ

  • メソッド宣言の場合、JENERICタイプの制限を解消するために、特定のタイプの代わりに使用
  • は、その種類が不明であるため、オブジェクト
  • とみなす.
    public void wildcardMethod(WildcardGeneric<?> c) {
        Object value = c.getWildcard();
        System.out.println(value);
    }

    制限付きWildCardタイプ

  • に制限はありませんどんなタイプもいるかもしれないので、タイプを制限する暗闇
    これは、
  • のようなTypeNameクラスのすべてのクラスを拡張することを意味します.
  • public void boundedWildcardMethod(WildcardGeneric <? extends Car> c) {
        Car value = c.getWildcard();
        System.out.println (value);
    } 

    ジェニリック漢方法宣言

  • ワイルドカードを使用する場合、パラメータに変換するタイプは変更できません.
  • メソッドをJENERICと宣言した場合、JENERICタイプの値を変更できます.
  • public class GenericWildcardSample {
        public static void main(String[] ar){
            GenericWildcardSample ex = new GenericWildcardSample();
            ex.callGenericMethod();
        }
        public <T> void genericMethod(WildCardGeneric<T> c, T addValue){
            c.setWildCard(addValue);
            T value = c.getWildCard();
            System.out.println(value);
            // Teemo
        }
    
        public void callGenericMethod(){
            WildCardGeneric<String> wildcard = new WildCardGeneric<String>();
            genericMethod(wildcard, "Teemo");
        }
    }
  • GenericMethod()の宣言によると、彼は「世界保健機関発展計画要綱」を書き、Generic方式でこの方法を発表した.
  • パラメータはTタイプのaddValueオブジェクトも受信し、メソッドのcの値はaddValueとして指定される.
  • ここでTは範囲を設定することもできます.
  • public ❮T extends Car❯ void genericMethod(WildCardGeneric❮T❯ c, T addValue)
  • の1つの方法では、2つ以上のジェニーリックタイプをパラメータとして受信した場合、(カンマ)で区切ることができる.
  • public void genericMethod(WildCard Generic❮?❯ c, T addValue1, S addValue2)
  • Refference
    https://onsil-thegreenhouse.github.io/programming/java/2018/02/17/java_tutorial_1-21/
    https://limkydev.tistory.com/56