次の Employee クラスと Manager というサブクラスを考えてみましょう。
public class Employee
{
private String name;
public Employee(String name)
{
this.name = name;
}
public String getInfo()
{
return name;
}
}
public class Manager extends Employee
{
public Manager(String name)
{
super(name);
}
}
別のクラスでは、次のように 2 つの関数を定義しました。
import java.util.ArrayList;
public class WildCardsAndTypeVariables
{
public static <T extends Employee> void displayInfo(ArrayList<T> employees)
{
for (int i=0; i<employees.size(); i++)
{
Employee employee = (Employee) employees.get(i);
System.out.println(employee.getInfo());
}
}
public static void displayInfo2(ArrayList<? extends Employee> employees)
{
for (int i=0; i<employees.size(); i++)
{
Employee employee = (Employee) employees.get(i);
System.out.println(employee.getInfo());
}
}
public static void main(String[] args)
{
Employee e1 = new Employee("John");
Employee e2 = new Employee("Joe");
Employee e3 = new Manager("Joseph");
ArrayList<Employee> employees = new ArrayList<Employee>();
employees.add(e1);
employees.add(e2);
employees.add(e3);
displayInfo(employees);
displayInfo2(employees);
}
}
displayInfo() と displayInfo2() から同じ出力が得られます。
では、この例を考えると、ワイルドカードと型変数の違いは何でしょう?