java - 通配符和类型变量有什么区别?

标签 java wildcard type-variables

考虑以下 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/

相关文章:

java - 是否可以使用 hibernate 4 和 EJB 3.1 将 Multi-Tenancy 功能添加到 java 应用程序?

java - 如何在java中调用R的auto.Arima函数并存储预测结果?

Java泛型,通配符的嵌套集合

linux - 为什么 Unix 通配符 "*"不包括 ".*"?

java - 从实现类中获取类型参数的类

haskell - 约束的类型别名不与上下文共享相同的变量绑定(bind)行为

Haskell 引用类型变量

java - 使用泛型在列表中转换对象

Java:什么决定了 Linux 机器中可能的最大堆大小

python - 使用 like 和 python 和 mysql 连接器编写查询