ジェネリック医薬品を使用するのは簡単 - のJavaの基礎

0.はじめに

  • Javaのジェネリックの中にJavaでC ++ C ++のテンプレートとジェネリック医薬品を知っている必要があり、ある程度、多くを学んだ学生の実際の開発に使用し、それはまだかなり好きです。
  • 私は、Javaを書いて、大規模な人々はリストの実装クラスのArrayListを使用していると信じています。ジェネリック医薬品のないJavaの前に、その内部には、オブジェクトの配列の実装です。また、これは問題につながり、それがオブジェクトであれば、当然そこに意気消沈し、必要なときに使用される要素だ、とするたびに、それから、我々は内部の任意のオブジェクトを投げることができることを意味します。オブジェクトへの自動移行、使用中に、それは間違って行くことは容易であるとき、私ははい内部保持のか分からないようにします。以下のような:
    ArrayList list = new ArrayList();
    list.add("string1");
    list.add("string2");
    String str = (String) list.get(0);
    list.add(new File("test.txt"));
    复制代码
  • ただし、使用する一般的な簡単な、私たちはしばしば、一般的なリストを使用しますが、私たちはジェネリッククラスを書きたい場合はそう簡単ではありません。

1.一般的な最も簡単な

package io.ilss.advanced.generic;

/**
 * className MyObject
 * description MyObject
 *
 * @author feng
 * @version 1.0
 * @date 2019-01-24 18:32
 */
public class MyObject<T> extends BaseData {
    private T valueOne;
    private T valueTwo;

    public MyObject(T valueOne, T valueTwo) {
        this.valueOne = valueOne;
        this.valueTwo = valueTwo;
    }

    public T getValueOne() {
        return valueOne;
    }

    public void setValueOne(T valueOne) {
        this.valueOne = valueOne;
    }

    public T getValueTwo() {
        return valueTwo;
    }

    public void setValueTwo(T valueTwo) {
        this.valueTwo = valueTwo;
    }

    public static void main(String[] args) {
        MyObject<String> object = new MyObject<>("String one!", "String two");
        System.out.println("value one " + object.valueOne + " value two " + object.valueTwo);
    }
}
复制代码
  • アングルブラケットと、変数T型に組み込まMyObjectには、<>クラス名の後ろに、囲み。複数種類を定義する際には可変であってもよい、で<>カンマ区切り例えばpublic class MyObject<T, U>{…}、直接変数のタイプのクラス定義に使用すると、型を使用している場合に使用するクラス名とみなすことができます。

2.クラスへの復帰を作るために、一般的なインターフェイスを使用します

  • 私が書いたJavaプログラマは、我々はResponseMsgが返されるジェネリッククラス統一応答をカプセル化するために使用するWebインターフェースを書かれていると信じています。
package io.ilss.advanced.generic;

/**
 * className ResponseMsg
 * description ResponseMsg
 *
 * @author feng
 * @version 1.0
 * @date 2019-01-24 18:47
 */
public class ResponseMsg<T extends BaseData> {
    public static int SUCCESS_CODE = 1;
    public static int ERROR_CODE = 0;
    public static int OTHER_CODE = -1;
    private int code;
    private String msg;
    private T data;

    public static <U extends BaseData> ResponseMsg sendSuccess(U data) {
        ResponseMsg<U> responseMsg = new ResponseMsg<>();
        responseMsg.code = SUCCESS_CODE;
        responseMsg.data = data;
        responseMsg.msg = "Remote Call Success!";
        return responseMsg;
    }

    public static <U extends BaseData> ResponseMsg sendError(U data, String msg) {
        ResponseMsg<U> responseMsg = new ResponseMsg<>();
        responseMsg.code = ERROR_CODE;
        responseMsg.data = data;
        responseMsg.msg = "Remote Call Error";
        return responseMsg;
    }
    public static <U extends BaseData> ResponseMsg sendOther(U data, String msg) {
        ResponseMsg<U> responseMsg = new ResponseMsg<>();
        responseMsg.code = OTHER_CODE;
        responseMsg.data = data;
        responseMsg.msg = msg;
        return responseMsg;
    }

    public static void main(String[] args) {
        System.out.println(ResponseMsg.<MyObject>sendSuccess(new MyObject<String>("asdf","asfd")));
    }

    @Override
    public String toString() {
        return "ResponseMsg{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
复制代码
  • 上に焦点がある<U>静的メソッドを持つ私はカプセル化しResponseMsg、建物をのみ、あなたはゲッターセッターメソッドを記述、または直接プライベートメソッドにすることはできません人々はクラスに通過させるための静的メソッドの呼び出しを提供する必要があります。
  • 使用する一般的な方法ならば、前の戻り値の型に必要なタイミングを一緒に使用することができる場合のみです。メソッド呼び出しの前で直接起動すると<>、着信クラスあなたが使用したいです。上記に示したように、方法は、それらの一般的なジェネリッククラス定義に直接渡されてもよいです。
  • さらに、それはまたすることができますextendsあなたが特定のサブクラスで定義するか、またはインターフェイスを実装します。複数のインターフェースが存在する場合、そのようなを、&に接続することができる<T extends Comparable & Serializable>汎用の複数が存在し得る場合、<T extends OneObject, U extends TwoObject>

3.注意

  • ジェネリック医薬品は、直接することができないnew外部の着信が必要です。以下のような:
     T data = new T();     //这是不被允许的,不能实例化对象
     T[] arr = new T[10];  //这也是不被允许的  不能构造泛型数组
    复制代码

私について

  • 杭州、通常の学部読み取り、コンピュータ科学と技術的専門知識、卒業20年、練習段階に現在ある座標。
  • 主にJava開発を行って、Golang、シェルについて書きます。この方向に行う準備ができマイクロサービス、興味ビッグデータ、。
  • 狂った兄が学習され、新人の段階では、あなたの首長は、スプレーを点灯し、現在です。
  • 私はあなたと交換アヒルを歓迎します!

おすすめ

転載: juejin.im/post/5d137c79e51d45775c73dd20