当サイトは、アフィリエイト広告を利用しています
javaのジェネリクスを使用方法(仮型パラメータ)を使った
クラス、メソッドの定義方法をまとめる
基本的にはクラス、またはメソッド内で動的に型を使いたい時に使用するイメージ
汎用的な処理を行うメソッド、クラスで処理を行う型を動的に決めたい場合などに使用する。
SomeClass< T >と書くと、その型パラメータTをクラスのフィールドや
(引数、戻り値を含めた)メソッド内で使用することができる。
// ↓ここに型パラメータを書くpublic class SomeClass<T> {private T t;private List<T> list = new ArrayList<T>();public void set(T arg){this.t = arg;}public T get(){return this.t;}}
//使用時に仮型パラメータを指定するSomeClass<String> some = new SomeClass<>();some.set("テスト1");
上記の
SomeClass<String> some = new SomeClass<>();
で使う時、ジェネリクスクラスは下記のようなイメージ
※< T >の部分がString型に置き換わっている
public class SomeClass {private String t;private List<String> list = new ArrayList<String>();public void set(String arg){this.t = arg;}public String get(){return this.t;}}
なお、以下のようにジェネリッククラスの仮型パラメータを
そのクラス内のstaticメソッドやstatic文の中で使用することはできない。
public class Hoge<T>{static {T t; // コンパイルエラー}public static void hoge(T t){ // コンパイルエラー}}
メソッドの戻り値の型の手前にTを書くと、
その型パラメータTをメソッド内で使用することができる。
// ↓ここに型パラメータを書くpublic static <T> ArrayList<T> someMethod(T arg){ArrayList<T> list = new ArrayList<T>();list.add(arg);return list;}
String hoge = "ほげ";List<String>list = someMethod(hoge);
上記の使い方をする場合のジェネリクスメソッドは下記のようになっている
public static ArrayList<String> someMethod(String arg){ArrayList<String> list = new ArrayList<String>();list.add(arg);return list;}
カンマ区切りで複数パラメータを指定できる
public static <K, V> HashMap<K, V> newHashMap(){return new HashMap<K, V>();}// ※<K,V>の型は左辺から推測してくれるMap<String, Integer> map = newHashMap();
< T extends クラスやインターフェース >のように書くと、
Tが指定したクラスのサブクラス(または指定したクラスそのもの)
であることを呼び出し側に要求することができる。
// Number型のサブクラスもしくはNumber型でのみインスタンス化できるArrayListpublic class NumArrayList<T extends Number> extends ArrayList<T> {}List<Number> numberList = new NumArrayList<Number>(); // okList<Double> doubleList = new NumArrayList<Double>(); // okList<String> stringList = new NumArrayList<String>(); // コンパイルエラー
下記を参考にしました。
他にもjavaのことが詳しく書かれているのでお勧めです。