Когда мы добавляем два абстрактных метода в интерфейс и реализуем только один метод, почему мы не можем реализовать другой метод с помощью лямбда? - PullRequest
0 голосов
/ 10 июля 2020

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

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

Ответ будет заключаться в том, что для создания действительной реализации вам потребуется иметь возможность передавать N лямбд за один раз, что внесет много двусмысленности. и огромное снижение читабельности.

Теперь я провел небольшой эксперимент, я создал интерфейс с двумя реализованными абстрактными методами с разными сигнатурами.

Это myInterface интерфейс

interface MyInterface {
    abstract void func();
    abstract void func(int i);
}

И реализовал одну функцию, как обычно, а другую как лямбда-выражение

Это Lambda класс

class Lambda implements MyInterface{

    public void doWork(MyInterface myInterface) {
        myInterface.func();
    }
    public static void main(String[] args) {
        Lambda lambda = new Lambda();
        lambda.doWork( e -> System.out.println("func:" + e ));
    }

    @Override
    public void func() {
        System.out.println("func");
    }
    
}

Очевидно, этот код не работает . Я просто не могу понять, хотя у меня две разные сигнатуры, и даже если одна из них реализована нормально, почему мы не можем реализовать другой оставшийся метод с лямбда. Это как-то связано с качеством кода и удобством обслуживания? Может ли кто-нибудь объяснить, что я не могу понять это? Пожалуйста, дайте пример, если возможно.

1 Ответ

0 голосов
/ 12 июля 2020

Вы можете создать подчиненный интерфейс MyInterface со всеми методами, кроме одного, реализованными с использованием ключевого слова default. Это позволяет вам предоставлять по умолчанию реализации, которые разработчики интерфейса «наследуют», если они не предоставляют собственные реализации. Таким образом, методы с реализацией по умолчанию больше не являются абстрактными. Если вы по умолчанию реализуете все интерфейсы, кроме одного, в субинтерфейсе, вы получите функциональный интерфейс (интерфейс с одним абстрактным методом). И это позволяет использовать лямбда-выражения.

interface PartialInterface extends MyInterface {
    @Override
    default void func() {
        System.out.println("func");
    }
}
class Lambda {
    public void doWork(PartialInterface myInterface) {
        // both methods from the interface can be used
        myInterface.func();    // the default implementation "inherited" from PartialInterface
        myInterface.func(42);  // the single abstract method (inherited by PartialInterface from myInterface) overridden by the lambda expression
    }

    public static void main(String[] args) {
        Lambda lambda = new Lambda();
        lambda.doWork(e -> System.out.println("func:" + e));
    }
}
...