поток несовместимого типа при сборе - PullRequest
5 голосов
/ 25 сентября 2019

В: Учитывая список людей, верните всех учеников.

Мои занятия:

Класс человека

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());
}

Я получаю ошибку компиляции: несовместимые типы:Переменная вывода T имеет несовместимые границы

Я не знаю, как вернуть всех студентов из списка, используя поток, без получения этой ошибки.

Ответы [ 3 ]

12 голосов
/ 25 сентября 2019
return list.stream()
           .filter(Student.class::isInstance)
           .map(Student.class::cast)
           .collect(Collectors.toList());

Это должен быть актерский состав, в противном случае, это все равно Stream<Person>.Проверка instanceof не выполняет никакого приведения.

Student.class::isInstance и Student.class::cast - только мои предпочтения, вы можете пойти с p -> p instanceof Student и p -> (Student)p соответственно.

5 голосов
/ 25 сентября 2019

Вам нужен состав:

public static List<Student> findStudents(List<Person> list) 
{
    return list.stream()
               .filter(person -> person instanceof Student) 
               .map(person -> (Student) person)
               .collect(Collectors.toList());
}
0 голосов
/ 25 сентября 2019

Другая альтернатива.

public static List<Student> findStudents(List<Person> list) 
{
    return list.stream()
            .filter(s -> Student.class.equals(s.getClass()))
            .map(Student.class::cast)
            .collect(Collectors.toList());
}
...