Метод возврата по умолчанию метода интерфейса Java 8 не ясно - PullRequest
0 голосов
/ 29 апреля 2018

недавно я начал читать о функциях java8, и одна такая особенность, с которой я столкнулся, была

метод по умолчанию

, нет ничего уникального в том, что касается концепции, но я наткнулся на этот фрагмент кода, который использовал лямбда-выражение для возврата значения (void) из метода по умолчанию. Но я вижу, что тип возврата метода по умолчанию - типа interface. (который я считаю недействительным), так как логика внутри метода по умолчанию ничего не возвращает, теперь я озадачен поведением, так как не вижу ошибки компиляции, Но когда я устанавливаю тип метода по умолчанию как void, компилятор выдаёт ошибку ( Тип цели этого выражения должен быть функциональным интерфейсом ). Может ли кто-нибудь объяснить об этом поведении в отношении использования лямбды?

public interface Op {
void runOp();
static void timeOperation(Op testOp) {

}

 default Op combinedOp(Op secondOperation) {
    return ()->{secondOperation.runOp();};
}
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вы всегда можете написать лямбда-выражение не лямбда-способом с анонимным классом, содержащим реализацию одного абстрактного метода.

Применительно к вашему примеру вы можете написать метод

default Op combinedOp(Op secondOperation) {
    return ()->{secondOperation.runOp();};
}

не лямбда-образом, как это:

default Op combinedOp(Op secondOperation) {
    return new Op() {
        @Override
        public void runOp() {
            secondOperation.runOp();
        }
    };
}

Теперь стало понятнее, что метод combinedOp возвращает что-то, то есть экземпляр интерфейса Op.

Однако метод runOp этого экземпляра ничего не возвращает. Следовательно, его тип возвращаемого значения void.

0 голосов
/ 29 апреля 2018

Op - это функциональный интерфейс , то есть интерфейс с SAM (один абстрактный метод).

combinedOp - это метод по умолчанию, который принимает Op в качестве параметра и возвращает Op not void . В Java функциональные интерфейсы могут использоваться в качестве целевых типов для лямбда-выражений или ссылок на методы, поэтому приведенный ниже код полностью допустим:

default Op combinedOp(Op secondOperation) {
    return ()->{secondOperation.runOp();};
}

этот код потребляет Op, который затем возвращает функцию, которая при вызове выполняет функцию secondOperation.

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