Javaのジェネリックのワイルドカード[T]と[?]コンセプトエントリ

目的は、私たちはコンパイル時に間違ったコードにつながる手続きを規制しないコードを検出するのに役立つために、一般的なJavaコンパイラ・メカニズムを使用することです。たとえば、私たちは皆、そのリストコンテナはあらゆる種類のデータを保持することができます知っているので、私たちは同じ容器に同時に文字列と整数のリストの他の種類を置くことができますが、このような行為は非常に危険です。一般的なメカニズムでは、この操作は、コンパイラが通らない、あなたはタイプを統一するように変更必須データ型のリストのコンテナになりますが発生します。このメカニズムは、私たちは隠されたバグを実行している軽減することができます。

ジェネリック{T}

ジェネリックは広くコードで使用されます。

一般的な使用法

使用の一般的な位置、クラス(クラス)の使用、すなわち、属性(フィールド)とメソッド(方法)の異なる位置は、一般的な次の使用のように要約することができます。

1.一般的なクラス。一般的な識別は、クラス名の後添加(<T ...>)、図ためのそのようなホルダの一種。

2.一般的な性質。プロパティはT.保持ジェネリッククラスタイプを受け取るための、一般的なクラスの一般的な使用と組み合わされなければなりません

3.一般的な方法。この方法で定義された一般的なパラメータTである方法、の戻り値の前に一般的な宣言(<Tは、親クラス名を拡張>)。

ジェネリック医薬品のサプリメントの使用状況

ジェネリックTが変更されていない1延び場合、我々は、一般的な無限を呼び出し、(クラス及びメソッドを含む);変更した場合、我々は境界汎用呼び出し延びます。

2.一般的なT、および方法は、一般的な方法が、一般的なクラスではありませんTタイプ、前に何のジェネリックメソッドのパラメータを返さない場合。

独立した一般的な方法が使用されるオブジェクトの3例は、クラスツールのクラス(すなわち、この方法は、ツールです)。

4.アラームを生成する際の一般的な方法で、一般的なTと授業時間内に同じ名前のジェネリックT、なぜならあなたが使用したいオブジェクトを保持していることを確認コンパイラ。

一般的な有界

(定義されていないタイプ)一般的な無制限の使用と比較して、我々は、に保持された物体の範囲を定義する、またはメソッドのジェネリックメソッドのパラメータの範囲を通過するように(<Tは、親クラス名を拡張>)境界ジェネリックを使用することができビジネスロジックの適切な実行を確保するためです。

ジェネリック有界のみ(延び)上限、下限を使用しない(ワイルドカードに対して[?])。

ジェネリック医薬品の継承

コードの一部を使用することによって継承一般的な記述。

ArrayListの<文字列> ArrayListを= 新しい ArrayListを<> (); 
対象オブジェクト = 新しいオブジェクト(); 
arrayList.add(オブジェクト)。// 编译器报错

ArrayList <ストリング>の代わりのArrayList <OBJECT>サブクラスは、コンパイラは文句になるので、エラーメッセージは、型のArrayList <ストリング>のメソッドを追加(文字列)である引数(オブジェクト)のために適用されません。

通配符【?】

ワイルドカードは、(従来の方法宣言の戻り型を必要としない一般的な方法との違いに注意してください。プロセスにおいて使用される未知のタイプの代表です。

上限ワイルドカード

キーワードは、拡張して、ワイルドカード文が定義されているワイルド上限上限。

パブリック 静的 ボイドプロセス(一覧<?延び foo>のリスト){/ * ... * /}

無制限のワイルドカード

ワイルドカードの境界を制限するものではありません無制限のワイルドカードは、キーワードへの変更を必要としない[を?]。

公共の 静的な 無効がprintlist(一覧<?>リスト){ / * ........ * / }

ワイルドカードとタイプオブジェクトの宣言の関数形式は差です。

パブリック 静的 ボイドがprintlist(一覧<OBJECT>リスト){ / * ........ * / }

リストの<Object>とList <?>と同じではないが、前者はオブジェクトオブジェクトまたは任意のサブクラスのオブジェクトを挿入することができますが、後者は場合にのみヌル型の不一致を挿入することができます。

パブリック クラスTestWildCard {
     公共 のボイドがprintlist(一覧<文字列> リスト){
         のために(オブジェクトELEM:リスト)
            System.out.print(elemは + "" ); 
        System.out.println(); 
    } 

    パブリック 無効 printList2(<?>一覧リスト){
         のために(オブジェクトELEM:リスト)
            System.out.print(elemは + "" ); 
        System.out.println(); 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 
        TestWildCard testWildcard = 新しいTestWildCard()。

        ArrayListの <?延び OBJECT>のArrayList = 新規のArrayList <>は、(); 
        arrayList.add(NULL )。
        // arrayList.add(testWildcard)。// 报错

        のArrayList <オブジェクト> arrayList2 = 新しい ArrayListを<> (); 
        arrayList2.add(NULL )。
        arrayList2.add( "2" ); 

        リスト <整数> =リチウムは、Arrays.asList(1、2、3 )。
        testWildcard.printList2(LI)。
        // testWildcard.printList(LI); // 报错

        一覧<ストリング> LS =は、Arrays.asList( "1"、 "2"、 "3" )。
        testWildcard.printList2(LS)。
        testWildcard.printList(LS)。
    } 
}

下界のワイルドカード

スーパー業界の下で定義される下限ワイルドカードワイルドカードは、キーワード拡張を宣言しました。

公共の 静的な 無効 addNumbers(一覧<?スーパー整数>リスト){}

ジェネリック{T}ワイルドカード[?]違い

最も基本的な違いは、ジェネリックとJavaコンパイラをワイルドカードは、一般的な特定の種類に{T}、およびワイルドカードを推測することである[枚]未知のタイプを推論します。ジェネリックを使用する必要がある動作パラメータを変更するには、存在する場合にのみ、それはワイルドカードを使用することができます参照してください場合は、Javaエディタは、未知のタイプの特定のタイプを操作することはできません動作することができます。

このように、我々は、ワイルドカード機能を使用するには、安全なインターフェースを設計することができます。野生パラメータインタフェースで、そのような方法を定義する、インターフェイスのすべてのメソッドは、パラメータが連続を介して送信されるプロセスを変更することができます。

インタフェースGInterface {
     <T> ボイド FOO(リスト<?延び T> リスト)。
} 

パブリック クラス GInterfaceImplが実装GInterface { 
    @Overrideの
    パブリック <T> ボイドのfoo(リスト<?延び T> リスト){
         // 只能遍历リスト、不能修改リストの
        ための{(リストTのT)
            のSystem.out.println(T ); 
        } 

        // list.add(新しいオブジェクト())。// 编译器报错
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 
        GInterfaceImpl gIterfaceImpl =新しいGInterfaceImpl(); 
        ArrayListの <文字列>リスト= 新しい ArrayListを<> (); 
        list.add( "1" )。
        list.add( "2" ); 
        list.add( "8" )。
        gIterfaceImpl.foo(リスト); 
    } 
}

 

「あなたはこの世界の最も穏やか弱い、悪い男だし、あなたは強力なから来ます。」

おすすめ

転載: www.cnblogs.com/yanggb/p/10961968.html