高度なJavaのジェネリック

初日の基礎を築くために、

アンドロイドの開発のための基礎として、Java言語の知識、今はkotlinを開始しているが、我々はまだ次のような理由に基づいたJavaをしっかり把握を取る必要があるが、

  • kotlinはまた、Javaランタイムにコンパイルする必要があります。
  • 現在、サードパーティのライブラリの数が多いと彼の前任者のJavaコードが書かれ受け継ぎます。
  • Java言語のアプリケーションだけでなく、Androidの中で、バックグラウンドで開発されても、最も人気のある言語の一つです。
  • 大企業は、我々は強固な基盤を持っていることをJava言語にインタビューするために必要とされています。だから、彼らのJavaベース、慎重に検討し、メモを取ると大きな進歩のために努力してくださいを改善する機会を過小評価しないでください。

なぜジェネリック

public int addInt(int x, int y){
    return x+y;
}
public float addInt(float x, float y){
    return x+y;
}

public static void main(String[] args){
    List list = new ArrayList();
    lisr.add("1");
    lisr.add("2");
    lisr.add(3);
    for(int i = 0; i < list.size(); i++){
        String name = (String) list.get(i);
        System.out.println("value");
    }
}
// 运行时会出现“java.lang.ClassCastException”

复制代码

実際の開発、多くの場合、合計の需要値がある、すなわち、異なるデータ型と同じことを行うために、同じロジックを実行する。あなたはジェネリックのために実行する必要があります。この時間。

上記の符号化処理では、我々は、主に2つの問題が見つかりました:

  • 私たちは、コレクション内のオブジェクトを置くとき、コレクションは、Object型の変更に収集、コンパイル型オブジェクトから再びこのオブジェクトを取り出したオブジェクト、このタイプのを覚えていないだろうが、それはどのようなタイプでそのコースを実行します自分自身を入力します。
  • このように、要素1人のキャストのコレクションを削除する//必要性は、特定のターゲット・タイプに変換し、「java.lang.ClassCastExceptionが」例外を起こしやすいです。

だから、一般的な利点は次のとおりです。

  • 同じコードが実行されるデータタイプの様々な適用
  • 使用中の指定されたジェネリック型は、キャストする必要はありません

ジェネリッククラスとジェネリックインターフェイス

ジェネリック、または「パラメータ化された型。」パラメータの言及メソッドのパラメータを定義する際に、最も精通が表示され、その後、引数を渡すときに、このメソッドを呼び出します。それでは、どのようにパラメータ化された型にそれを理解するには?名前が示唆するように、元のパラメータとして特定のタイプである、プロセス変数パラメータのタイプと同様に、また(タイプパラメータを参照することができる)パラメータの形式で、この時点で定義され、特に、着信/通話を使用する場合にされますタイプ(型引数)。パラメータタイプに一般的な自然(typeパラメータを制御するためではない、新しいタイプの場合に作成されたが、特に指定されたジェネリックの異なる種類によって制限されます)。一般的な使用であり、その動作のデータ型は、クラス、インタフェースおよびメソッドのタイプに使用することができる一般的なクラス、ジェネリックインターフェイス、ジェネリックメソッドと呼ばれるパラメータとして指定されています。型変数Tを導入する(大文字は他のであるが、一般にT、E、K、V、等に使用される)、および<>囲まで処理し、クラス名を以下。ジェネリッククラスは、変数の複数のタイプが許可されています。

public class NormalGeneric<T>{
    private T data;
    public NormalGeneric(){
    }
    public NormalGeneric(T data){
        this();
        this.data = data;
    }
}
public class NormalGeneri2c<T, V>{
    private T data;
    private V result;
    public NormalGeneric2(){
    }
}
public interface Generator<T>{
    public T next();
}
复制代码

ジェネリッククラスとジェネリックインターフェイスは、実質的に同じで定義されました。

二つの方法の方法で実装クラスの汎用インタフェース

//不传入泛型实参时
public class GeneratorImpl<T> implement Generator<T>{
    public T next(){
        return T;
    }
}
// 传入泛型实参
public class GeneratorImpl2 implement Generator<String>{
    public String next(){
        return "ok";
    }
}
复制代码

一般的な方法

一般的な方法は、特定の種類の、一般的な方法は、一般的な指定と一般クラスとジェネリッククラスを含む、メソッド呼び出しのシーンの任意の時点でどこでも使用することができます。従来の方法とジェネリッククラスとの間の差は、一般的な方法で定義されていることに留意されたいです。

public class GeneratorMenhod<T>{
    private T data;
    // 这不是一个泛型方法 这只是在泛型类中的一个普通方法  只不过是它的返回类型是泛型类中的类型.
    public T get(){
        return data;
    }
    
    // 这才是一个泛型方法 在public与返回值指尖的<T>不可缺少
    public <T> T textMetgod(T...a){
        return a[a.length/2];
    }
}
复制代码

定義型の変数

時々、私たちは、このような二つの変数の最小値、最大値を計算するなどの変数の種類の制約、する必要があります。

    public <T> T textMetgod(T a, T b){
        return a.compareTo(b) > 0 ? a : b;
    }
    // 编译报错  提示没有a  compareTo方法
复制代码

2つの変数がcompareToメソッドを合格していなければならないことを保証するために、どのように?この問題に対する解決策は、同等クラスが実装するインタフェースをTを制限することです

    /* T表示应该绑定类型的子类型,Comparable表示绑定类型,子类型和绑定类型可以    是类也可以是接口。*/
    public <T extends Comparable> T min(T a, T b){
        return a.compareTo(b) > 0 ? a : b;
    }
    
    /* 如果这个时候,我们试图传入一个没有实现接口Comparable的类的实例,将会发生编译错误。*/
    
    public static void main(String[] args){
        min(22, 22);// 成功比较
        min("a", "b");// 成功比较
        min(new Test(), new Test()); // 提示报错
    }
复制代码

同時期に延びるようにTとして、複数のを可能にする、Vが同等&シリアライズ音符定義型を拡張する、最初のリストで定義されなければならないクラスが、存在する場合にのみ1つのクラスを可能にし、。このクラスは、一般的なクラスにも使用することができる一般的な方法を定義する際に使用することができます

一般的な制約と制限

おすすめ

転載: juejin.im/post/5dcd30336fb9a0201e3c645b