Java のジェネリックスの Bounded 型

はじめにこのページで用いる Person クラス、そしてそのサブクラスである SalesPerson クラスを定義します。

public class Person {
  String name;
  public Person(String name){
    this.name = name;
  }
  public String getName(){
    return name;
  }
}

public class SalesPerson extends Person {
  int empID;
  public SalesPerson(int empID, String name){
    super(name);
    this.empID = empID;
  }
  public int getEmpID(){
    return empID;
  }
}

getName メソッドというメソッドはスーパークラスである Person クラスにて実装されていることに注意してください。この点に注意しつつ、次のメソッドをみてください。

public static <T extends Person> void showName(T[] a){
  for(Person p : a){
    System.out.println(p.getName());
  }
}

T 型の配列を受け取って、その配列に対して for-each 文を用いてそれぞれの要素の getName メソッドを呼び出しています。

このコードが正しく動くためには、引数として渡される型は Person クラスから派生したクラスでなければなりません。 なぜなら、getName メソッドは Person クラスで定義されているからです。例えば String オブジェクトでは getName メソッドがありませんので、処理は失敗します (というか意味がありません。もともとそんなメソッドがないのですから)。

このように、ジェネリックスの型として一定の制限をかけたい場合に、それを指定することができます。それがメソッド定義の <T extends Person> の箇所です。

<T extends Person> という表記で「T は Person から派生したクラスです」 と指定できます。

こうして制限付けされた型を Bounded 型といいます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門