Java

<デバックをコンパイルにやらせる>←これ ジェネリクス#2

ジェネリクスとは??

ジェネリクスが必要な理由などは次の記事がご覧ください

【もし型がなかったら何がおこるか】ジェネリクス#1もし型がなかったら Javaでは変数を用いる時、必ず型(type)を指定します。変数には、その指定した型の情報(数値やインスタンス)し...

ジェネリクスの宣言方法

APIに準備されたString型や、自分で宣言したHero型クラスなどのクラスやメソッドはそのままでは、<〜>記法は使えません。ArrayListやHashMapにだけ<〜>記法が許されているのは、それらが普通のクラスとしてではなく、ジェネリクスと言われる特別な仕組みを使って定義されています。つまり、自分で宣言するクラスに<〜>を使いたい場合は、<〜>を使って宣言する必要があります。同様にメソッドにも<〜>を使いたい場合は、<〜>を使って宣言する必要があります。

ジェネリクスを使って宣言されたクラスやメソッドは、<〜>記法を利用できる。

<>の中に入るもの

特に定めらていませんが、基本的に1文字で定義します。
がしかし慣例があります。

・E    要素
・K    キー
・V    値
・T    型
・N    数値
・S,U,V    2,3,4番目

実際に宣言してみる

ワイルドカードを使う

・上限付きの境界ワイルドカード型

・hogeclass<? extends クラスA>

クラスAとクラスAを継承したクラスをジェネリクスとして使用できる
その変数から値を取り出す(get)際は、上限であるクラスA型のデータ型を返すように動作し意図したとおりに動作しますが、値を設定する(put)際は、putされる値がクラスAのサブクラスということは保証できるが、実際にどのクラスか特定できないため、コンパイルエラーになります。

・下限付きの境界ワイルドカード型

・hogeclass<? super クラスB>

クラスBとクラスBのスーパークラス(親クラス、基底クラス)
その変数に値を設定する(put)際は、下限であるクラスBのデータ型を設定するように動作し意図したとおりに動作しますが、値を取り出す(get)際は、どのデータ型か特定できないためObject型として取り出されます。

注意

クラスで使うジェネリクスとメソッドで使うジェネリクスによって様々な違いがあります。

・method1はクラスで指定したNumberおよびNumberを継承したクラス型しか受け付けない
・method2は何でも受け付ける

1 2 3 4