考虑以下 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);
}
}
在另一个类中,我定义了两个函数如下-
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() 得到相同的输出。
那么,考虑到这个例子,通配符和类型变量之间有什么区别?
最佳答案
在这种情况下,该方法仅采用一个参数并具有 void
返回类型,您不会获得任何好处,也不会在通配符类型版本和泛型方法之间的语义上产生任何差异版本。当您在方法签名(参数类型或返回类型)中多次使用类型变量时,泛型方法的真正威力就会显现出来,一个简单的例子是
public static <T extends Employee> T firstEmployee(ArrayList<T> employees) {
return employees.get(0);
}
这表示“此方法采用一个 ArrayList,其成员都是 Employee
(或 Employee
本身)的某个子类的所有实例,并且它返回的值是 Employee
的实例em>同一个类”。这是您无法仅使用通配符来表达的内容。
关于java - 通配符和类型变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186769/