こちらを読むと
- Javaのジェネリクス クラスの定義方法、使用例が分かります。
ジェネリクスとは
ジェネリクスとは”一般的”という意味で、IntegerやStringなど特定の型を扱うのではなく、それらを抽象化して一般的な型として扱える仕組みです。
馴染み深いのは、Listなどのコレクションです。
よくList<String>のように記載して、Stringを扱うListを作りますが、<>の中の型は何でもよい(一般的)であるわけです。
言葉で説明していても分かりづらいので、さっそく具体例を見てみましょう。
ジェネリクス クラス
以下のコードは、ジェネリクス クラスの例です。
(プログラミング言語Java 第4版より)
こちらのクラスでは、<E>という記号を用いて、クラス内で扱える型を抽象化しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class Cell<E> { private Cell<E> next; private E element; public Cell(E element) { this.element = element; } public Cell(E element, Cell<E> next) { this.element = element; this.next = next; } public E getElement() { return element; } public void setElement(E element) { this.element = element } public Cell<E> getNext() { return next; } public void setNext(Cell<E> next) { this.next = next; } |
Listなどのコレクションと同様、<E>に任意の型を入れることができます。
例えば、Stringを保持するCellは、以下のように生成して参照できます。
(プログラミング言語Java 第4版より)
1 |
Cell<String> strCell = new Cell<String>("Hello"); |
もちろん、String以外の型を扱うこともできます。
1 2 |
Cell<Integer> intCell = new Cell<Integer>(Integer.valueOf(2)); Cell<Double> doubleCell = new Cell<Double>(Double.valueOf(1.2)); |
Objectクラスで扱えばよいのでは?
ここで、一つ疑問が出てきます。
JavaにはObjectクラスという、全クラスのSuperクラスがありますよね。ジェネリクスを使わなくても、Objectクラスで扱えばよいのでは?
Objectクラスで扱うと、いろいろ問題が出てきます。
こちらの話は、次回の記事で書こうと思います。
まとめ
- Javaのジェネリクス クラスの定義方法、使用例が分かりました。
ジェネリクス、慣れないと使いづらいのですが、慣れてしまえば便利な仕組みなので、ぜひ押さえておきましょう!
Reference
https://qiita.com/rodentia/items/b36d134fa24867ba4d63
こちらの書籍は、Javaの仕様が網羅的に書かれています。参照的に使うと効果的です!