如何将不兼容类型的对象流式传输到列表中?

时间:2019-09-25 08:16:56

标签: java java-8 java-stream incompatibletypeerror

我的问题是:给定人员列表,返回所有学生。

这是我的课程:

人员班

public class Person {
}

学生班

public class Student extends Person {
}

方法

public static List<Student> findStudents(List<Person> list) {


    return list.stream()
            .filter(person -> person instanceof Student)
            .collect(Collectors.toList());
}

我遇到了编译错误:incompatible types: inference variable T has incompatible bounds

如何使用流从列表中返回所有学生,而不会出现此错误。

3 个答案:

答案 0 :(得分:12)

return list.stream()
           .filter(Student.class::isInstance)
           .map(Student.class::cast)
           .collect(Collectors.toList());

应该在此强制转换,否则,它仍然是Stream<Person>instanceof检查不执行任何强制转换。

Student.class::isInstanceStudent.class::cast只是我的偏爱,您可以分别选择p -> p instanceof Studentp -> (Student)p

答案 1 :(得分:5)

您需要强制转换:

public static List<Student> findStudents(List<Person> list) 
{
    return list.stream()
               .filter(person -> person instanceof Student) 
               .map(person -> (Student) person)
               .collect(Collectors.toList());
}

答案 2 :(得分:1)

另一种选择。

synchronized (obj) {
  if (!obj.has_result) {
    obj.wait();
  }
  return obj.result;
}