несовместимые типы: объект не является функциональным интерфейсом netbeans-11 java - PullRequest
1 голос
/ 06 января 2020

Я довольно новичок в лямбда-выражении Java 8

Я попробовал следующее и получил ошибку компиляции

class Test{
    static interface MySupplier {

        Object supply();
    }

    public static void main(String[] args) {
        Object v = value();
        if (v instanceof MySupplier) {
            v = ((MySupplier) v).supply();
        }
        System.out.println(v);
    }

    static Object value() {
//        return () -> "this line will NOT get compiled."; //Error: incompatible types: Object is not a functional interface ???
//        return (Object)(() -> "this line will NOT get compiled, too."); //Error: incompatible types: Object is not a functional interface ???
        return new MySupplier() {

            public Object supply() {
                return "using inner class will work but lambda expression it not";
            }
        };

    }
}

мой вопрос: "Можно ли использовать лямбда? Выражение как обычный объект. Я хочу сделать что-то вроде

    static Object value(Object v) {
        if (v instanceof MySupplier) {
            return ((MySupplier) v).supply();
        }
        return v;
    }

    public static void main(String[] args) {
//        if some case
        Object v1 = value("value 1");
        // else if some other case
        Object v1 = value(() -> { 
            //do some stuff
            return "value 2";
        });
    }

Я много занимался поиском, но безуспешно. Есть ли обходной путь? Спасибо заранее!


update : после лучшего понимания лямбда-выражения проблема заключается в том, как сообщить компилятору целевой тип лямбда-выражения для компиляции. Таким образом, ответ от ernest_k может быть улучшен как

return (MySupplier) () -> "this line will work";

1 Ответ

3 голосов
/ 06 января 2020

Вы не можете напрямую вернуть свое лямбда-выражение таким образом. Это связано с тем, что целевой тип лямбда-выражения должен быть функциональным интерфейсом.

В настоящее время вы создаете лямбда-выражение в контексте оператора возврата метода, что означает, что тип лямбда-выражения является типом возврата этого метода , Это недопустимо:

Object supplier = () -> "this line will get COMPILE-ERROR. -> ?????????"; //NO

Это потому, что целевой тип (Object) не является функциональным интерфейсом. По той же причине, по которой это недопустимо *

Но вам не нужно этого делать, и наличие MySupplier в качестве возвращаемого типа делает этот код чистым.

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