Javaジェネリックは、Java言語の最も重要な機能の一つです。 ジェネリックの背後にあるアイデアは非常に単純ですが、ジェネリックに関連する通常の構文からのシフトのために複雑になることがあります。
このチュートリアルの目的は、この便利なジェネリックの概念を理解しやすい方法で紹介することです。
しかし、ジェネリック自体に飛び込む前に、最初にJavaジェネリックが必要だった理由を理解してみましょう。,
Javaジェネリックの目的
Java5でジェネリックを導入する前に、エラーや警告をスローすることなく、次のようなコードスニペットを記述してコンパイルすることができます。
格納するデータのタイプを宣言することなく、任意のタイプの値をリストまたは別のJavaコレクションに追加できます。 しかし、リストから値を取得するときは、明示的に特定の型にキャストする必要があります。
上記のリストを反復処理することを検討してください。,
最初に格納されたデータ型を宣言せずにリストを作成できるようにすると、プログラマは上記のような間違いを犯し、実行時にClassCastExceptions
をスローする可能性があります。
ジェネリック医薬品の導入を防ぐプログラマーからなのです。ジェネリックを使用すると、次の例に示すように、Javaコレクションの作成時に格納されるデータ型を明示的に宣言できます。,注:格納されたデータ型を指定せずにJavaコレクションオブジェクトを作成することはできますが、推奨されません。
これで、コンパイル時エラーをスローせずに文字列型リストに整数を誤って格納することはできません。 これにより、確実にプログラムにはきちんと走るように、実行時エラー.
javaへのジェネリックの導入の主な目的は、実行時にClassCastExceptions
に実行されないようにすることでした。
Javaジェネリックの作成
ジェネリックを使用してJavaクラスおよびメソッドを作成できます。, 各タイプのジェネリックを作成する方法の例を見てみましょう。
ジェネリッククラス
ジェネリッククラスを作成するとき、クラスのtypeパラメータは、angle<>
角かっこ内のクラス名の最後に追加されます。
ここで、T
はデータ型パラメータです。 T
、N
、およびE
は、Javaの規則に従ってデータ型パラメータに使用される文字の一部です。,
上記の例では、GenericClassオブジェクトを作成するときに特定のデータ型を渡すことができます。
汎用クラスオブジェクトの作成時に、プリミティブデータ型をデータ型パラメーターに渡すことはできません。 みデータ型を拡張するオブジェクトタイプとして渡すことができ型のパラメータ。
たとえば、
ジェネリックメソッド
ジェネリックメソッドの作成は、ジェネリッククラスの作成と同様のパターンに従います。 実践できる汎用的な方法で内部を汎用的なクラスなど非る。,
ここでは、メソッドをパラメータ化するために特定の型の配列を渡すことができます。 ジェネリックメソッドPrintItems()
は、渡された配列を反復処理し、通常のJavaメソッドと同じように格納されたアイテムを出力します。
有界型パラメーター
これまでのところ、上記で作成したジェネリッククラスとメソッドは、プリミティブ型以外の任意のデータ型にパラメーター化 しかし、ジェネリックに渡すことができるデータ型を制限したい場合はどうなりますか? これが、有界型パラメーターの出番です。,
ジェネリッククラスまたはメソッドで受け入れられるデータ型をバインドするには、別のデータ型のサブクラスであることを指定します。ここでは、UpperBoundedClass
およびUpperBoundedMethod
は、List
データ型のサブタイプを使用してのみパラメータ化できます。
データ型は、パラメータ化できません。
データ型は、
データ型のサブタイプを使用してパラメータ化することができます。
データ型は、
データ型です。
List
データ型は、typeパラメーターの上限として機能します。 List
のサブタイプではないデータ型を使用しようとすると、コンパイル時エラーがスローされます。
境界はクラスのみに限定されません。, とすることができますインターフェースです。 拡張の手段と、この場合、実装のインタフェース。
この例のように、パラメーターに複数の境界を設定することもできます。
受け入れるデータ型は、AnimalクラスとMammalクラスの両方のサブクラスでなければなりません。 これらの境界のいずれかがクラスである場合、境界宣言の最初に来なければなりません。
上記の例では、MammalがクラスでAnimalがインターフェイスである場合、Mammalは上記のように最初に来なければなりません。 そうしないと、コードは捨てコンパイル時にエラーとなります。,
Java Genericsワイルドカード
ワイルドカードは、ジェネリック型のパラメータをメソッドに渡すために使用されます。 ジェネリックメソッドとは異なり、ここでは、ジェネリックパラメータは、上記で説明したデータ型パラメータとは異なる、メソッドによって受け入れられる ワイルドカードは?で表されます。 シンボル。
上記のprintItems()
メソッドは、パラメータとして任意のデータ型のリストを受け入れます。 これにより、プログラマは異なるデータ型のリストに対してコードを繰り返す必要がなくなります。,
上部有界ワイルドカード
メソッドで受け入れられるリストに格納されているデータ型を制限する場合は、有界ワイルドカードを使用できます。
例:
printSubTypes()
メソッドは、色のサブタイプを格納するリストのみを受け入れます。 RedColorまたはBlueColorオブジェクトのリストを受け入れますが、Animalオブジェクトのリストは受け入れません。 これは、動物が色のサブタイプではないためです。 これは、上限のワイルドカードの例です。,
下位有界ワイルドカード
同様に、
次に、printSuperTypes()
メソッドは、Dogクラスのスーパータイプを格納するリストのみを受け入れます。 LabDogはDogのスーパークラスではなく、サブクラスであるため、哺乳類または動物オブジェクトのリストを受け入れますが、LabDogオブジェクトのリストは受け入 これは、下限のワイルドカードの例です。
結論
Javaジェネリックは、その導入以来、プログラマがなくては生きられない機能になっています。
この人気は、プログラマの生活をより簡単にすることへの影響によるものです。, コーディングミスを防ぐ以外に、ジェネリックを使用すると、コードの繰り返しが少なくなります。 異なるデータ型のコードを繰り返す必要がないように、クラスとメソッドを一般化する方法に気付きましたか?
ジェネリックをよく理解していることは、言語の専門家になるために重要です。 だから、このチュートリアルで学んだことを実用的なコードに適用することは、今前に進む方法です。