Сбой вывода типа Java: <захваченный шаблон> не является функциональным интерфейсом - PullRequest
0 голосов
/ 21 марта 2019

При использовании компилятора java 8 эта программа:

import java.util.function.Consumer;
public class xx {
    public void execute(Consumer<? super Runnable> executor, Runnable action) {
        executor.accept(() -> action.run());
    }
}

завершается с ошибкой:

xx.java:4: error: incompatible types: <captured wildcard> is not a functional interface
        executor.accept(() -> action.run());
                        ^

Очевидно, что компилятору не удалось определить тип () -> action.run().

Это легко исправить, либо изменив ? super Runnable на Runnable, либо явным образом приведя лямбду к Runnable.

Мой вопрос: этот сбой кажется "тупым" ... такое поведениеопределяется JLS, или это ошибка компилятора?

1 Ответ

0 голосов
/ 22 марта 2019

Захват ? super Runnable представляет собой заданный, но неизвестный супер-тип Runnable (возможно, Object).Чтобы классифицировать тип как функциональный интерфейс, вам нужна верхняя граница, а не нижняя граница.Для вывода типа лямбды OTOH в качестве целевого типа требуется интерфейс функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...