Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通配符和类型变量之间有什么区别?_Java_Wildcard_Type Variables - Fatal编程技术网

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

Java 通配符和类型变量之间有什么区别?,java,wildcard,type-variables,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 Employe

考虑以下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);
   }
}
import java.util.ArrayList;
公共类通配符和类型变量
{
公共静态无效显示信息(ArrayList员工)
{
对于(inti=0;i当您使用type(例如T)时,您将只能发送特定类型的具体对象

但是,当您使用通配符时,您定义的是对象的边界。所以,您可以传递类型为T的对象(或任何类型为T的对象)


在你的例子中,你只有Empoylee,所以差别不大。但是让我们假设你有一个扩展了Empoylee的class Contractor。然后你会看到差别。

你的例子有很多问题

displayInfo2
中,当您正在读取而不是写入传递的数组中的
Employee
对象时,应使用
?extends Employee
。例如,如果您希望将
Manager
数组传递给该方法,则在进行此更正之前,它不会键入check

一旦解决了这个问题,您就不需要用这两种方法调用
employees.get()


不同之处在于,您在
displayInfo
中为未知类型指定了一个名称(
T
),但在这个特定的示例中,您只需要一个通配符就可以了,因为您所关心的只是
Employee
部分。

在这种情况下,该方法只接受一个参数,并且具有一个
void
返回类型,在通配符类型版本和泛型之间没有任何好处或语义上的差异方法版本。当您在方法签名(参数类型或返回类型)中多次使用类型变量时,泛型方法的真正威力就来了,下面是一个简单的例子

public static <T extends Employee> T firstEmployee(ArrayList<T> employees) {
  return employees.get(0);
}
public static T firstEmployee(ArrayList员工){
返回员工。获取(0);
}

这表示“此方法获取一个ArrayList,其成员都是
Employee
(或
Employee
本身)的某个子类的实例,并且它返回的值是同一类的实例”更新:我添加了一个类管理器,它扩展了Employee。现在创建一个类型管理器列表,并尝试将其传递给displayinfo2()。我观察到的另一件事是,在display1()中,这表示“t”Employee可以是Employee的任何子类。这是因为display2()出现了错误只接受employee(或)employee超类的类型。我尝试将displayInfo2()的定义更改为?extends employee,它接受经理。那么在这种情况下有什么区别?我正在更新问题。。。