Невозможно переопределить метод интерфейса по умолчанию, используя лямбда-выражение - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть функциональный интерфейс, который содержит 1 статический метод, 1 метод по умолчанию и 1 нестатический абстрактный публичный метод, как показано ниже: -

package com.lambda;

@FunctionalInterface
public interface MyFunctionalInterface {

    static void printDetails(){
       System.out.println("Im a static method");
    }

    default void printDetails2(){
        System.out.println("I'm in default method");
    }

    void printName();

}

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

package com.lambda;

public class Example1 {

    public static void main(String[] args) {
        //static method call
        MyFunctionalInterface.printDetails();

        //Lambda expression call to an abstract method
        MyFunctionalInterface myFunctionalInterface = () -> System.out.println("My name is Vinod Kumar Nair");
        myFunctionalInterface.printName();

        //Lambda expression call to a default method
        MyFunctionalInterface myFunctionalInterface1 = () -> System.out.println("Im overriding default method");
        myFunctionalInterface1.printDetails2();



    }
}

Вот вывод, который я получаю: -

Im a static method

My name is Vinod Kumar Nair

I'm in default method

Используя лямбда-выражение, я могу вызвать статический методназывается «printDetails».Я также могу переопределить «printName ()» с помощью моей логики реализации, где печатается «Меня зовут Винод Кумар Наир».

Проблема в том, что я не могу переопределить метод по умолчанию, printDetails2 () с моей реализацией.Я не получаю вывод как «Я переопределяю метод по умолчанию».Я все еще получаю логику реализации по умолчанию.

Есть ли проблема в переопределении метода по умолчанию с помощью лямбда-выражения.Если да, то вы можете сказать мне, как переопределить этот метод по умолчанию, используя лямбда-выражение.

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

@FunctionalInterface означает, что у вас есть только один метод для реализации.

Когда вы делаете

 MyFunctionalInterface myFunctionalInterface1 = () -> System.out.println("Im 
overriding default method");

Вы реализуете метод, но не переопределяете любой метод по умолчанию.

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

public class MyClass implements MyFunctionalInterface {
    @Override 
    void printDetails2() { ... }

    @Override 
    void printName() { ... }
}
0 голосов
/ 19 февраля 2019

Вы не можете.Лямбда-выражения в Java могут использоваться только для интерфейса с одним абстрактным методом (в данном случае printName) и будут использоваться в качестве реализации этого абстрактного метода.Обратите внимание, что любой экземпляр MyFunctionalInterface должен реализовывать printName;Откуда вы хотите, чтобы она пришла, если ваша лямбда использовалась для printDetails2?

Если вы хотите реализовать какие-либо методы по умолчанию, вы должны использовать анонимный класс:

MyFunctionalInterface myFunctionalInterface1 = new MyFunctionalInterface {
    @Override 
    void printDetails2() { ... }

    @Override 
    void printName() { ... }
};

(«должен» в этом контексте: когда вы хотите создать его на месте и присвоить переменной.)

...