ジェネリックスと
Java では、ジェネリックにより、より広範囲の型に対してタイプセーフな操作が可能になります。ただし、
Map> expected = null; Map > result = null; assertThat(result, is(expected)); このコードは、Matcher を期待するassertThat メソッドに渡される引数の型が正しくないため、コンパイルに失敗します。 T> を拡張します。 Matcher
の代わりに。なぜこれが起こるのかを理解するには、ジェネリック型の共分散の概念を詳しく調べる必要があります。 共分散とは、サブタイプをスーパータイプに安全に割り当てることができることを示しています。言い換えれば、クラス extends Serializable>オブジェクトは Class に割り当てることができます。 T> を拡張します。物体。ただし、その逆は当てはまりません。Class T> を拡張します。オブジェクトを Class に割り当てることはできません。 extends Serializable> object.
これは、共分散が型パラメーター自体にのみ適用され、それに含まれる型引数には適用されないためです。この例では、java.util.Date は Serializable のサブタイプですが、Class extends Serializable>は必ずしも Class のサブタイプである必要はありません。 extends Date>.
assertThat メソッドの署名を Matcher に変更します。 T> を拡張します。では、実際の型のサブタイプと一致するマッチャーを許可することで、この問題を解決しています。これにより、コード スニペットのような状況に必要な柔軟性が提供されます。
ただし、
の使用には潜在的な欠点があることに注意することが重要です。この文脈では。たとえば、特定のシナリオでは、予期しない動作や型の安全性の低下につながる可能性があります。 assertThat メソッドの汎用性に関しては、使用されるマッチャーが結果の型と互換性があることを確認するための型チェックが可能です。これにより、実行時エラーの可能性が完全に排除されるわけではありませんが、互換性のない一致が防止されるため、安全性が向上します。
以上がJava ジェネリックで「 vs. 」をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。