如何在java中从超类到子类获取对象?

时间:2017-09-14 03:57:01

标签: java

Person有几个子类,包括Employee

有一种方法可以返回另一个List,它只包含Employee原始列表中的Person个对象。

如何在Java中完成此操作?

3 个答案:

答案 0 :(得分:2)

简单的例子:

public class Test {
public static void main(String[] args) {
    List<Person> lst = new ArrayList<Person>() {
        {
            add(new Person());
            add(new Person());
            add(new Employee());
            add(new Employee());
            add(new AnotherPerson());
            add(new AnotherPerson());
        }
    };

    List<Person> employes = lst.stream().filter(item -> item instanceof Employee).collect(Collectors.toList());
    System.out.println(employes.size());
}

class Person {

}

class Employee extends Person {

}

class AnotherPerson extends Person {

}
}

答案 1 :(得分:1)

  

人有几个子类

  

返回另一个只包含Employee对象的List

您应使用instanceOf来完成从Employee寻找专门寻找List<Person>班级的工作。只是为了例如:

List<Person> personList // assigned to something
List<Employee> employeeList = new ArrayList<>();
for(Person person : personList)  {
    if(person !=null && person instanceOf Employee) { 
        employeeList.add((Employee) person);
    }
}

来自java-nutsandbolts的示例可能对您有帮助。

  

使用instanceof运算符时,请记住null不是   任何事情的实例。

答案 2 :(得分:0)

其他答案和评论应提供解决方案,但如果您想要通用解决方案,那么您可以这样做:

public static <T extends Person> List<T> getPersonTypes(Class<T> cls, Collection<Person> c)
{
  return c.stream()
      .filter(Objects::nonNull)
      .filter(p -> cls.isAssignableFrom(p.getClass()))
      .map(cls::cast)
      .collect(Collectors.toList());
}

然后打电话给这样的话:

List<Employee> employees = getPersonTypes(Employee.class, listOfPersons);