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

考虑下面的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本身)的实例,并且它返回的值是同一个类的实例”。这是不能用通配符来表示的。

本文翻译自 https://stackoverflow.com/questions/12186769/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java wildcard type-variables


相关文章:

java - 通用接口和通配符

java - 泛型上的通配符错误

java - 首次收到的Hyperledger Fabric框架不是SETTINGS。前5个字节的十六进制转储:1503010002

java - 在Android中,如何有效地找到方法的调用者

java - 如何在Android底部使用EditText创建扩展工具栏

java - 使没有注释或xml配置的Bean主服务器

mysql - 如何在MySql SELECT语句中正确使用LIKE语句?

java - 创建TypeVariable实例

java - 如何在Frege中使用类型变量声明本机接口?