Java学習4-1_ジェネリック

1つ、一般的な

1。概要

JavaジェネリックはJ2SE 1.5で導入されました。本質はパラメータ化された型です。」これは、メソッドの変数パラメータと同様に、元の具体的な型から型をパラメータ化することです。この時点で、型はパラメータ形式(と呼ぶことができます)としても定義されます。タイプパラメータ)を入力し、使用/呼び出し時に特定のタイプ(タイプ引数)を渡します。このタイプのパラメータはクラスインターフェイス、およびメソッドの作成に使用できます。これらは、ジェネリッククラス、ジェネリックインターフェイス、およびジェネリックと呼ばれます。タイプメソッド。

1.1一般的なクラス

/**
 * 泛型类
 */
//
public class ClassName<T> {
    
    
    private T data;

    public T getData() {
    
    
        return data;
    }
    public void setData(T data) {
    
    
        this.data = data;
    }
}

1.2汎用インターフェース

/**
 * 泛型接口
 */
public interface IntercaceName<T>{
    
    
    T getData();
}

1.2.1汎用インターフェースの実装

//指定类型
public class Interface1 implements IntercaceName<String> {
    
    
    private String text;
    @Override
    public String getData() {
    
    
    	return text;
    }
}

//不指定类型
public class Interface1<T> implements IntercaceName<T> {
    
    
    private T data;
    @Override
    public T getData() {
    
    
        return data;
    }
}

1.3一般的な方法

private static <T> T methodName(T a, T b) {
    
    }

1.4一般的な制限タイプ

ジェネリックを使用する場合、ジェネリックの限定された領域を指定できます。たとえば、特定のクラスの実装クラスである必要があります。形式は次のとおりです。

<T extends 类或接口1 & 接口2>

1.5ジェネリックのワイルドカード

タイプワイルドカードが使用されていますか?メソッド固有の型引数を置き換えます。

  1. <?extends Parent>は、ジェネリックタイプの最後を指定します
  2. <?super Child>は、ジェネリックタイプの最後を指定します
  3. <?>は、ジェネリックタイプの最後を指定します

1.6機能

(1)一般化(2)型の安全性(3)強制型変換の排除(4)後方互換性

コードの再利用率を向上させます。ジェネリックの型は使用時に指定され、強制的な型変換は必要ありません(型の安全性、コンパイラは型をチェックします)

型の安全性:ジェネリックの主な目標は、Javaプログラムの型の安全性を向上させることです。ジェネリックを使用して定義された変数の型制限を知ることにより、コンパイラーは非常に高いレベルで型の仮定検証できますジェネリックがなければ、これらの仮定はシステム開発者の心にのみ存在します。ジェネリックは、変数宣言でこの追加の型情報をキャプチャすることにより、コンパイラがこれらの追加の型制約を適用できるようにしますタイプエラーは、実行時にClassCastExceptionとして表示される代わりに、コンパイル時にキャッチできます。型チェックを実行時からコンパイル時に移動すると、Java開発者はエラーをより早く簡単に見つけることができ、プログラムの信頼性が向上します。

強制型変換の排除:ジェネリックの副次的な利点は、ソースコード内の多くの強制型変換が排除されることです。これにより、コードが読みやすくなり、エラーが発生する可能性が低くなります。強制型変換を減らすと、ジェネリッククラスを使用したコードの累積的な賞賛の度合いを高めることができますが、ジェネリック変数の宣言により、対応する累積的な度合いがもたらされます。単純なプログラムで汎用変数を1回使用しても、コードの蓄積の程度は減りません。しかし、一般的な変数を複数回使用する大規模なプログラムの場合、それを蓄積して賞賛の度合いを減らすことができます。したがって、ジェネリックが強制的な型変換を排除した後、コードがより明確でクリーンになります。

一般的な操作効率:非一般的なプログラミングでは、単純な型をオブジェクトとして渡すと、ボックス化操作とボックス化解除操作が発生し、どちらも多くのオーバーヘッドが発生します。ジェネリックの導入後は、ボクシングやアンボクシングの操作を行う必要がないため、特に収集操作が頻繁行われるシステムでは、操作効率が比較的高く、この機能によるパフォーマンスの向上がより顕著になります。

1.7注意

  1. コンパイル後、プログラムは縮退するための対策を講じます。
  2. Javaのジェネリックは、コンパイル中にのみ有効です。
  3. コンパイルプロセスでは、ジェネリックの結果が正しくチェックされた後、ジェネリックの関連情報が消去され、メソッドに出入りするオブジェクトの境界に追加されます。
  4. 型チェックと型変換方法。つまり、一般的な情報は実行時フェーズに入りません。
  5. Objectクラスにもequalsメソッドがあるため、ジェネリッククラスでequals(Tx)メソッドを定義しないでください。ジェネリッククラスが消去されると、これら2つのメソッドは競合します。

1.8一般的な消去

コンパイル中に、すべての一般的な情報が消去されます。

/**
 * 泛型擦除
 */
public class Test {
    
    
    public static void main(String[] args) {
    
      

        ArrayList<String> arrayList1=new ArrayList<String>();  
        arrayList1.add("abc");  

        ArrayList<Integer> arrayList2=new ArrayList<Integer>();  
        arrayList2.add(123);  

        System.out.println(arrayList1.getClass()==arrayList2.getClass()); //结果为true
    }  
}  

疑似ジェネリックの問題はC ++テンプレート
とは異なります。ブログを見て経験を積みました。ジェネリックの内部原則であるタイプの消去とタイプの消去によって引き起こされる問題をリンクするには、ここに投稿してください。

問題:

  1. ジェネリックの使用はパフォーマンスに影響しますか

    コンパイルフェーズでは、仮想マシンはジェネリックタイプを消去し、ジェネリックなしでコードを復元します。せいぜい、コンパイルは遅くなる可能性があります。

おすすめ

転載: blog.csdn.net/Sky_Coolssy/article/details/108762140