Как привести элементы в экземпляр List с потоками в Java 8? - PullRequest
0 голосов
/ 25 октября 2018

Учитывая код:

public Statement methodCallByName(MethodDeclaration method, String string) {
    List<ExpressionStatement> expressions = method.getBody().statements().stream()
                                                .filter(s -> s instanceof ExpressionStatement)
                                                .map(ExpressionStatement.class::cast)
                                                .collect(Collectors.toList());
    return null;
}

У меня есть следующая ошибка в Eclipse Oxygen:

enter image description here

Обратите внимание, что statements() возвращает List в соответствии с JDT документами .

Что не так?

1 Ответ

0 голосов
/ 25 октября 2018

Проблема вызвана statements() возвратом необработанного типа List (см. Также Что такое необработанный тип и почему мы не должны его использовать? ).

Необработанные типы могут не только провоцировать непроверенные операции, но и ограничивать применимость вывода типов.

Вы можете исправить это с помощью

public Statement methodCallByName(MethodDeclaration method, String string) {
    List<?> statements = method.getBody().statements();
    List<ExpressionStatement> expressions = statements.stream()
        .filter(s -> s instanceof ExpressionStatement)
        .map(ExpressionStatement.class::cast)
        .collect(Collectors.toList());
    // ...
    return null;
}

Преобразование из необработанного типа List в список неизвестных элементов типа List<?>, это единственное безопасное преобразование типов, которое мы можем сделать здесь.Поскольку вы все равно будете проверять и разыгрывать элементы, это не ограничивает вас.

Но учтите, что вы должны стараться быть последовательными.Используйте

.filter(s -> s instanceof ExpressionStatement)
.map(s -> (ExpressionStatement)s)

или

.filter(ExpressionStatement.class::isInstance)
.map(ExpressionStatement.class::cast)
...