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 型といいます。