EeBlog(テクニカルブログ)

第27回 ジェネリックスクラス

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

まず「ジェネリックスクラスとは何ぞや」というところから始めます。 前回ジェネリックスメソッドについて書きましたので、ジェネリックスクラスのイメージはある程度つかめるのではないかと思います。 ジェネリックスクラスとは、クラス名の後ろに<T>や<E>といった型パラメータを指定して宣言するクラスです。 代表的なジェネリックスクラスとして、ListやSetなどのコレクションがあります。 コレクションのソート時に使うComparator、Comparableなどもジェネリックスクラスになっています。

それでは実際にサンプルを見て確認していきましょう。 まずはいつものSportsインターフェースとその具象クラスです。

public interface Sports {
    void play(); }
public class Badminton implements Sports {
    @Override
    public void play() {
        System.out.println("バドミントンして遊びます。");
    }
}

public class Volleyball implements Sports {
    @Override
    public void play() {
        System.out.println("バレーボールして遊びます。");
    }
}

今回はPlayerクラスをジェネリックスクラスにしました。
コレクションのTと、その要素のEという二つの型パラメータを定義しています。
Tを拡張for文で使えることと、Eがplayメソッドを使用できることに注目してください。

import java.util.Collection;

public class Player<E extends Sports, T extends Collection<E>> {
    private T t;
  
    public Player(T t) {
        this.t = t;
    }
    public void play() {
        System.out.println("ウォームアップします。");

        for (E e : t) {
            e.play();
        }

        System.out.println("クールダウンします。");
    }
}

Mainクラスです。
Listと同様にPlayerにも型パラメータをつけて使用します。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Sports> sportList = new ArrayList<Sports>();
        sportList.add(new Badminton());
        sportList.add(new Volleyball());
 

        Player<Sports, List<Sports>> player = new Player<Sports, List<Sports>>(sportList);
        player.play();
     }
}

ジェネリックスクラスはいかがだったでしょうか。 ジェネリックスクラスを自作する機会の有無に関わらず、Javaの文法上こういうことができるということは知っておいたほうがよいでしょう。