Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Object_Arraylist - Fatal编程技术网

Java 是否可以在列表中添加不同类型的对象(子类类型)(如果列表类型是它们的公共超类)?

Java 是否可以在列表中添加不同类型的对象(子类类型)(如果列表类型是它们的公共超类)?,java,list,object,arraylist,Java,List,Object,Arraylist,最近,我看到了这篇关于列表中不同对象的类似文章(请不要将其标记为重复)在文章中提到,为了完成这项工作,必须为这些项目实现一个公共类。 然而,在下面的代码段中,上述对象的类只是对类Employee使用扩展而不是实现 我想知道它是否可以这样工作 import java.util.*; public class Main { public static void main(String[] args) { SalariedEmployee emp1 = new SalariedEmpl

最近,我看到了这篇关于列表中不同对象的类似文章(请不要将其标记为重复)

在文章中提到,为了完成这项工作,必须为这些项目实现一个公共类。

然而,在下面的代码段中,上述对象的类只是对类Employee使用
扩展
而不是
实现

我想知道它是否可以这样工作

import java.util.*;
public class Main
{
    public static void main(String[] args) {
    SalariedEmployee emp1 = new SalariedEmployee();
    HourlyEmployee emp2 = new HourlyEmployee();

    emp1.setName("Jack Smith");
    emp1.setAm("72154f");
    emp1.setSalary(3000);

    emp2.setName("John Smith");
    emp2.setAm("13521a");
    emp2.setHoursWorked(300);
    emp2.setHourlyPayment(4);

    List<Employee> emp = new ArrayList<Employee>();
    emp.add(emp1);
    emp.add(emp2);

   for(Employee item:emp){
       System.out.println("Employee ID:"+item.getID());
       System.out.println("Employee Name:"+item.getName());
       System.out.println("Employee AM:"+item.getAm());
       System.out.println("Employee Payment:"+item.payment());
}
import java.util.*;
公共班机
{
公共静态void main(字符串[]args){
SalariedEmployee emp1=新的SalariedEmployee();
HourlyEmployee emp2=新的HourlyEmployee();
emp1.设定名称(“杰克·史密斯”);
emp1.setAm(“72154f”);
emp1.setSalary(3000);
emp2.设定名称(“约翰·史密斯”);
emp2.setAm(“13521a”);
emp2.工作时数(300);
emp2.设定小时付款(4);
List emp=new ArrayList();
emp.add(emp1);
emp.add(emp2);
用于(员工项目:emp){
System.out.println(“员工ID:+item.getID());
System.out.println(“员工姓名:+item.getName());
System.out.println(“Employee AM:+item.getAm());
System.out.println(“员工付款:+item.Payment());
}

类通过

  • 扩展
    如果此其他类型是类或
  • 实现
    此类型的if接口
所以是的,因为
受薪员工
小时员工
都是
员工
(这两种类型都是
扩展了员工
,正如您在问题中提到的)您的列表

List<Employee> emp = new ArrayList<Employee>();
List emp=new ArrayList();

应该能够毫无问题地存储此类派生类的实例。

您需要列出Employee类的列表,这些类已经存在并且可以正常工作

List<Employee> employees = new ArrayList<>();

通过不绑定,您将自己严格限制为对象
Employee
类型,而不是其所有子类。

当我使用非泛型语法列表emp=new ArrayList()时;我收到一个编译器警告?好吧,只是试着运行你的代码;)有任何错误吗?通过扩展或实现它是同一类型吗?换句话说,超类的类型是否与其他类在同一层次结构中的类接口的类型相同?我不确定我是否正确理解你,但这可能会有所帮助。你不能类和接口都是类型。使类也成为某些接口类型的方法是通过关键字
implements
并从接口向方法添加实现。如果要使类也成为其他类的类型,则使用
扩展
关键字。我不明白这是如何工作的,为什么需要这样做。你能再给我解释一下吗?有了这个你就“跳”了列表对象所允许的类的类型。还有一些很好的教程。我将详细介绍我的答案,说明为什么不应该是ListAha,我使用了Java 7语法。如果您使用Java 6,那么您需要重新指定
,是的。有了它,您就无需编写代码,因为您没有为具有边界的特定子类类型编写方法
public void doSomething(List<? extends Employee> list) {...}
public void doSomethingElse(List<Employee> list) {...}
doSomething(employees); //fine
doSomething(semployed); //fine

dosomethingElse(employees); //fine
dosomethingElse(semployed); //error!