知っていると便利な章
4.14. ジェネリック型を引数として渡す場合
『目的』
4.13. ジェネリックメソッドの例ではListのメンバーがすべて同じT型の要素を扱いました。 これは型安全性に配慮し、そのように作ったのだから当然ですね。
しかし、このままではList
NumberとInteger,Longに継承関係があってもList
境界ワイルドカード型を使用して、ポリモーフィズムにも対応できるようにしましょう。
ジェネリックメソッドを使用したリスト連結
以下の例ではconcatGenericをジェネリックメソッドとして定義しています。
この場合、引数としてList
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // リストの和をとる。 List<Integer> l 1 = new LinkedList<>(); l 1 .add( 123 ); l 1 .add( 456 ); List<Integer> l 2 = new LinkedList<>(); l 2 .add( 789 ); List<Integer> catList = new LinkedList<>(); concatGeneric(catList, l 1 , l 2 ); for (Integer e : catList) { System.out.println(e); } // 123 456 789 // list 1 とlist 2 を連結させる。 private static <T> void concatGeneric(List<T> newList, List<T> list 1 , List<T> list 2 ) { newList.addAll(list 1 ); newList.addAll(list 2 ); } |
ここでNumber型にはInteger型の値を格納できるため、以下のようなことをしたくなるかもしれません。 しかし、これはコンパイルエラーになってしまいます。
1 2 | List<Number> catList = new LinkedList<>(); // concatGeneric(catList, l 1 , l 2 ); コンパイルエラー |
このような場合にはどうしたらいいでしょうか。
境界ワイルドカード型を使用したリスト連結
以下の例では境界ワイルドカード型を使用したジェネリックメソッドとして定義しています。
この場合、引数としてnewListにはTの基底型のリスト、list1,list2にはTの派生型のリストを渡すことができます。
ただし、サンプルコードのコメントにもあるように下限境界ワイルドカード型(super)を使うのはパラメータが代入専用である場合、 上限境界ワイルドカード型(extends)を使うのはパラメータが参照専用である場合にしましょう。
そうしないとポリモーフィズムが崩れてしまうことを確認してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // リストの和をとる。 List<Integer> l 1 = new LinkedList<>(); l 1 .add( 123 ); l 1 .add( 456 ); List<Long> l 2 = new LinkedList<>(); l 2 .add( 789 L); List<Number> catList = new LinkedList<>(); concatWildCard(catList, l 1 , l 2 ); for (Number e : catList) { System.out.println(e); } // 境界ワイルドカード型 // パラメータが代入専用である場合は下限境界ワイルドカード型を使用する。例)newlist // パラメータが参照専用である場合は上限境界ワイルドカード型を使用する。例)list 1 , list 2 private static <T> void concatWildCard(List<? super T> newList, List<? extends T> list 1 , List<? extends T> list 2 ) { newList.addAll(list 1 ); newList.addAll(list 2 ); } |
-
IS 559680 / ISO27001
認証範囲 本社、芝大門オフィス情報セキュリティ基本方針 -
個人情報保護方針
個人情報の取扱いについて
保有個人データ又は
第三者提供記録に関する
事項の周知について
特定個人情報の取扱いについて -
FS 671851 / ISO9001
認証範囲 本社、芝大門オフィス品質方針