Лямбда не переопределяет метод интерфейса из отдельного файла - PullRequest
0 голосов
/ 24 июня 2019
  1. Когда функциональный интерфейс находится в том же файле, где его переопределяет лямбда, он прекрасно компилируется.
package test.test;
public class Base {
    public static void main(String[] args) {
        Interface1 a = n -> System.out.println(2*n);
    }
}
interface Interface1 { 
    void multiplyByTwo(int x); 
}
  1. Когда функциональный интерфейс находится в отдельном файле и базовый класс реализует его, он не может скомпилироваться с ошибкой Base is not abstract and does not override abstract method multiplyByFour(int) in Interface3.
package test.test;
public class Base implements Interface3 {
    public static void main(String[] args) {
        Interface3 b = n -> System.out.println(4*n);
    }
}
package test.test;
public interface Interface3 { 
    void multiplyByFour(int x); 
}
  1. Здесь что-то не так? Почему лямбда не переопределяет метод во втором случае?

1 Ответ

2 голосов
/ 24 июня 2019

Ваш первый пример имеет:

public class Base {

, который не реализует Interface1

Однако, ваш второй пример имеет:

public class Base implements Interface3 {

, который реализует Interface3

Не уверен, что вы пытаетесь сделать здесь, но это предполагаемое поведение:

Интерфейсы

Когда класс реализует interface, вы должны реализовать всеметодов в класс

Например:

public interface IFoo {
    void bar();
}

и класс:

public class FooImpl implements IFoo {
    // must implement bar method in IFoo
    public void bar() {
        System.out.println("I did something");
    }

}

Наличие лямбды в основном методе не означает реализацию методов интерфейса.

Исправить?

Просто удалите implements Interface3, вам не нужно реализовывать интерфейс в своем классе, чтобы иметь возможность его использовать.

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