オブジェクト指向プログラミングでは、ジェネリックはタイプ セーフとコードの再利用性を強化する上で重要な役割を果たします。 Java ジェネリックでは、 などのワイルドカードを使用します。 T> を拡張します。 <と<は、共分散および反分散のシナリオを処理するために不可欠です。
JUnit と Hamcrest マッチャーを使用した次の例を考えてみましょう。
Map> expected = null; Map > result = null; assertThat(result, is(expected)); このコードは、次の理由によりコンパイルに失敗します。 assertThat メソッド シグネチャのジェネリック型パラメーターと実際の型の間の不一致
なぜ T> を拡張します。問題を解決します
< を使用する理由を理解するには? T> を拡張します。問題が解決したら、共分散の概念を詳しく見てみましょう。 Java では、配列は共変です。つまり、型 T が S のサブタイプである場合、対応する配列 T[] と S[] もサブタイプになります。
指定された例では、期待されるマップは次のようになります。 Serializable のサブクラスを表す Class オブジェクトのインスタンス。一方、結果マップは Date クラスを表す Class オブジェクトのみを保持できます。 を使用することでT> を拡張する場合、assertThat メソッドは、値が Date クラスを含む Serializable を拡張する任意のクラスのインスタンスであるかどうかをチェックするマッチャーを受け入れることができます。
assertThat におけるジェネリックの役割を強調する
JUnit のメソッドは、結果の型に適切なマッチャーが渡されるようにするための汎用メソッドです。一般に
と入力することで、メソッドは提供されたマッチャーが型 T に準拠していることを強制し、潜在的な型不一致エラーを防ぎます。 ジェネリック型の拡張の欠点
アサートの切り替え中Matcher へのパラメータ リストT> を拡張します。コンパイルの問題は解決されていますが、潜在的な欠点が生じます。この拡張されたパラメータ リストにより、T を拡張する型で動作する任意のマッチャーが許可されます。これにより、特定のシナリオで不正なマッチング ロジックが発生する可能性があります。
結論
の違いを理解するT> を拡張します。 << Java ジェネリックスでは、共分散を正しく処理するために重要です。提供された例では、 T> を拡張します。 Serializable のスーパータイプのマッチャーを柔軟に受け入れることができ、コンパイル エラーが解決されます。ただし、マッチャー ロジックでの意図しない不一致を防ぐために、ジェネリック型を拡張することによる潜在的な影響を考慮することが重要です。
以上が「」と「`」の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。