首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建一个在java中打印子arrayList项的方法

创建一个在java中打印子arrayList项的方法
EN

Stack Overflow用户
提问于 2020-05-01 18:09:10
回答 3查看 299关注 0票数 0

我有一个抽象的Person类,它有三个子类:AdminEmployeeStudent。只有一个管理对象。

我还有一个类,它的“名称”是Statics,并保存我需要的所有公共数据,如下所示:

代码语言:javascript
复制
public class Statics {  

private static Person currentLoginUser;
private static ArrayList<Person> people = new ArrayList<>();
private static ArrayList<Student> students = new ArrayList<>();
private static ArrayList<Employee> employees = new ArrayList<>();
//We don't need ArrayList<Admin> because there is only one admin in the whole program

//Adder and getter methods:
//...
}

您可能会问代码中的ArrayList<Person>是什么?当我创建一个对象时,我会将它添加到“它自己的类型数组”和"ArrayList<Person>“中。所以ArrayList<Person>每个人都有。

就像我说的,我只有一个管理员:

代码语言:javascript
复制
Person admin = new Admin(); //`Admin` extends `Person`

我想要创建一个方法(在Admin类中),它以arrayList of Person作为输入并打印它的数据。所以我做了这个:

代码语言:javascript
复制
//Admin class:
public void printList(ArrayList<Person> people){
//Do something
}

让我们假设admin想要查看学生列表:我这样称呼它:

代码语言:javascript
复制
ArrayList<Student> s = Statics.getStudents();
((Admin)admin).printList(s); //admin object was created by `Person` class so I have to cast it to (Admin) to use `Admin`'s own methods.

它(月食)说:

类型Admin中的printList(ArrayList<Person>)方法不适用于参数(ArrayList<Student>)

我试着把它给人看:

代码语言:javascript
复制
((Admin)admin).printList((ArrayList<Person>)s);

这一次我得到了一个错误:

不能从ArrayList<Student>转换到ArrayList<Person>

在这个链接中,答案是传递主arrayList,并检查它的对象是否来自“学生”类型,然后打印它的值,但是我不想每次都检查整个Person arrayList!我只想要一种方法,它使用和arrayList of Person的孩子(EmployeeStudent等),并打印他们。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-01 18:32:44

printList方法签名更改为:

代码语言:javascript
复制
public void printList(ArrayList<? extends Person> people)

解释

更改签名将允许您传递带有ArrayList或其子类的参数化的Person

在java中,? extends T构造称为上有界通配符

当在people方法中使用printList时,您将能够从列表中“消费”(get)人员(但不能“生产”(add)他们)。“消费”和“生产”在这里的意思是果胶

有关泛型的详细信息,请参阅泛型(Java教程)

票数 1
EN

Stack Overflow用户

发布于 2020-05-01 18:23:19

你的问题是仿制药。尽管Student扩展了Person,但是List<Student>做了而不是扩展了List<Person>。这就是为什么java泛型有通配符,它用? (问号)表示。

如果使用List<? extends Person>,这意味着列表中的每个元素都是Person或任何扩展Person的类的实例。

请参阅Oracle教程中的泛型课程“学习Java语言”中的泛型、继承和子类型

票数 2
EN

Stack Overflow用户

发布于 2020-05-01 18:33:35

正如@Abra所提到的,问题与泛型有关。您可以在代码中使用泛型来解决问题。

创建Admin类作为泛型类,并创建带有List<T> list参数的printList方法,以便它能够接受任何类型的对象。例如人、雇员、学生等。

这只是一个例子,因此请相应地更改您的代码。

代码语言:javascript
复制
public class Admin<T> {

  public void printList(List<T> list) {
   // Print list here
  }
}
代码语言:javascript
复制
    Statics stat = new Statics();
    Admin admin = new Admin<Student>();

    // Students
    admin.printList(stat.getStudents());
    // Employees
    admin.printList(stat.getEmployees());
    // People
    admin.printList(stat.getPeople());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61548175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档