EeBlog(テクニカルブログ)

第26回 ジェネリックスメソッド

今回のテーマは「ジェネリックスメソッド」です。

ジェネリックスメソッドの前に、簡単に「ジェネリックス」について説明します。 ジェネリックスは型の安全性のために、Java5から導入された機能です。 List<String> listのように宣言することで、listはString型の要素のみを保持するようになります。 例えば、listに対してInteger型の要素を追加しようとするとコンパイルエラーが発生します。 配列と同じように、要素の型を宣言時に決めることで、コレクションもタイプセーフとなったのです。

それではジェネリックスメソッドとは何なのでしょうか。 ジェネリックスメソッドとは、<T>や<E>といった型変数を使うことにより、特定の型を使わずに宣言されたメソッドのことです。 具体的な型はメソッドを呼び出す側が指定します。

実際のサンプルで確認していきましょう。 配列の要素を一意にしてList型で返すメソッドです。

import java.math.BigDecimal;
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String[] stringArray = { "あ", "あ", "い", "い", "う", };
        System.out.println(Arrays.toString(stringArray));
        List<String> stringUniqueList = getUniqueList(stringArray);
        System.out.println(stringUniqueList);
        System.out.println();

        Integer[] integerArray = { 1, 1, 2, 2, 3, };
        System.out.println(Arrays.toString(integerArray));
        List<Integer> intgerUniqueList = getUniqueList(integerArray);
        System.out.println(intgerUniqueList);
        System.out.println();

        BigDecimal bd1 = new BigDecimal("1.0");
        BigDecimal bd2 = new BigDecimal("2.0");
        BigDecimal bd3 = new BigDecimal("3.0");
        BigDecimal[] bdArray = { bd1, bd1, bd2, bd2, bd3, };
        System.out.println(Arrays.toString(bdArray));
        List<BigDecimal> bdUniqueList = getUniqueList(bdArray);
        System.out.println(bdUniqueList);
    }
    public static <T> List<T> getUniqueList(T[] array) {
        List<T> uniqueList = new ArrayList<T>();
        for (T t : array) {
            if (!uniqueList.contains(t)) {
                uniqueList.add(t);
            }
        }
        return uniqueList;
    }
 }

getUniqueListの戻り値であるList<T>の前に、<T>という型変数が宣言されていることに注目してください。 このように書くことにより、メソッド宣言時に具体的な要素の型を指定せずにメソッドが宣言できるのです。 型変数を<T extends Number>のように書くことも可能で、そのときの動作は容易に想像できるかと思います。

 

ジェネリックスメソッドを使用することで、型の安全性だけでなく処理の汎用性も得られます。 今回のメソッドでは、要素の型が何であろうと処理を行うことが可能です。 また、戻り値に対するキャストも不要となっています。

ジェネリックスメソッドを使いこなして、無駄なコードの削減に貢献していきましょう。