ホームページ  >  記事  >  Java  >  Javaの差異

Javaの差異

WBOY
WBOY転載
2023-09-01 13:05:061045ブラウズ

Javaの差異

Java は、その強力なオブジェクト指向プログラミング機能により、柔軟で効率的なコードを開発するための複数のメカニズムをプログラマに提供します。見落とされがちだが重要な概念の 1 つは分散です。 Java をマスターするには、特にジェネリックやコレクションを扱う場合、分散を理解することが重要です。この記事では、Java の分散について詳しく説明し、その種類 (共分散、反分散、不変) とその実際の応用について説明します。

分散を理解する

分散とは、より複雑な型のサブタイプとそのコンポーネントのサブタイプの間の関係を指します。簡単に言うと、これらのクラスが型パラメーターとして使用されるときに、クラスの型階層がどのように保持されるかを決定します。バリアントは、ジェネリックスを扱う場合に特に重要になり、割り当てにある程度の柔軟性を与えながら型の安全性を確保するフレームワークを提供します。

分散は主に 3 つのタイプに分類できます。

  • 共分散 - ClassBがClassAのサブクラスの場合、CollectionはCollectionのサブクラスとみなすことができます。

  • Contravariance - ClassB が ClassA のサブクラスの場合、Collection は Collection のサブクラスと見なされます。 p>

  • 不変性 - ClassAとClassBの間の関係に関係なく、CollectionとCollectionにはサブタイプ関係がありません。

それぞれの概念をさらに詳しく見てみましょう。

Java の共分散

Java では、ワイルドカードと extends 句を使用して共分散を実現します。例を考えてみましょう -

リーリー

この場合、 Cat オブジェクトまたはその任意のインスタンスを cat に追加できますが、 cat から読み取り、その結果を Cat として扱うことはできません。これは、 Animal や Object などの Cat のスーパータイプが含まれる可能性があるためです。したがって、猫に書き込むことはできますが、タイプセーフな方法で読み取ることはできません

Java における不変性

不変性は Java のデフォルトの動作であり、ClassA と ClassB の間の関係に関係なく、Collection と Collection の間にサブタイプ関係がないことを意味します。これは制限があるように思えるかもしれませんが、型の安全性にとって重要です。 Java では、String は Object のサブタイプですが、List は List のサブタイプではありません。これは、Java コレクションは変更可能であり、この関係を許可すると実行時型エラーが発生するためです。

リーリー

上記の例では、String は Object のサブタイプですが、List は List のサブタイプではないため、コンパイル エラーが発生します。

この機能は最初は制限のように思えるかもしれませんが、安全でない操作が実行されないようにする Java 型システムの重要な側面です。 List が List のサブタイプである場合、文字列ではないオブジェクトが List に追加される可能性があり、実行時に ClassCastException が発生します。

リーリー

この例は、タイプセーフな不変性を維持することが重要である理由を示しています。

有界型パラメータと分散

共分散と反分散は、有界型パラメーターに最も一般的に使用されます。境界付き型パラメーターは、型パラメーターが特定の型のサブタイプ (extends キーワード) またはスーパータイプ (スーパー キーワード) である必要があることを示す方法です。これにより、型の安全性を維持しながら、どの型をメソッドに渡すことができるかを柔軟に決定できます。

たとえば、Number とそのすべてのサブクラスのリストを操作するメソッドがあるとします -

リーリー

このメソッドでは、T は有界型パラメーターであり、Number または Number のサブタイプである必要があります。これにより、メソッドが List、List、List などを操作できるようになり、共分散

が示されます。 ###結論は###

要約すると、ジェネリックとコレクションを効果的に使用するには、Java の分散を理解することが重要です。これにより、型の安全性を確保しながら、柔軟なコードが可能になります。

共分散では、extends キーワードを使用すると、サブクラスでスーパークラスを置き換えることができるため、より一般的なオブジェクト処理が実現します。一方、反変性を使用すると、スーパークラスをサブクラスに置き換えることができ、より特定のオブジェクトに対してより広範囲の操作を実行できるようになります。

不変性は、異なる型のコレクション (継承を通じて関連付けられている場合でも) が一意性を維持し、実行時の型エラーを防ぐことによって型の安全性を維持します。

对象>字符串>

对象>字符串>

以上がJavaの差異の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。