Java Gold合格へ向けて
ジェネリクスとは扱う対象が異なるだけで処理は同じクラスを自動で生成する仕組みのことを指す。クラスの定義としては下記のように行う。インスタンス生成時に使いたいオブジェクトを指定できるようになる。
クラス定義例
class クラス名<T> { private T 変数名; public メソッド名(T 引数名) { // 処理 } }
ジェネリクス実装してみる
ジェネリクスを利用して、販売する商品を示すオブジェクトに応じて使い分けたいShopクラスを作成した。
クラス定義
public class Shop<T> { private T goods; public Shop(T goods){ this.goods = goods; } public void setGoods(T goods){ this.goods = goods; } public T getGoods(){ return goods; } }
例としてBookクラスを作成し、String型を指定したShopクラスのインスタンスと、Bookクラスを指定したShopクラスのインスタンスをそれぞれ生成した。どちらも同じようにgetGoodsで商品データを取得できていることが確認できる。
インスタンス生成/実行コード
public class Main { public static void main(String[] arg){ Shop<String> meatShop = new Shop<>("肉"); Shop<Books> bookShop = new Shop<>(new Books("技術書")); System.out.println(meatShop.getGoods()+"専門店"); System.out.println(bookShop.getGoods()+"専門店"); } } class Books { private String books; public Books(String books){ this.books = books; } @Override public String toString() { return books; } }
実行結果
肉専門店
技術書専門店
ちなみにジェネリクスで指定できる型は参照型に限られる。基本型の場合はコンパイルエラーとなるため注意が必要だ。
実行結果
public class Main { public static void main(String[] arg){ Shop<int> intShop = new Shop<>(1); } }
実行コード
java: 予期しない型
期待値: 参照
検出値: int
まとめ
ジェネリクスとは様々なオブジェクトで流用できるようにモノ視点で考えることが求められるオブジェクト指向ならではの仕組みだといえる。これを使って第7章ではコレクションを使って様々なことができるようになる。コレクションを勉強する前にジェネリクスを使いこなせるようになっておこう。