Я изучаю лямбда-выражения и ссылки на методы в Java 8 и вижу, что мы можем ссылаться на версию метода суперкласса, используя 'super', как:
супер :: имя
Но когда я это делаю, это не работает. Вот пример кода:
interface MyInterface {
int someFunc(int x);
}
class A {
static int Func(int y) {
// return (int) (Math.random() * y);
return y;
}
}
class B extends A {
static int Func(int y) {
// return (int) (Math.random() * y);
return y + 1;
}
}
public class Test {
public static void main(String[] args) {
System.out.print("Enter a number: ");
java.util.Scanner scanner = new java.util.Scanner(System.in);
int result = funcOp(B::Func, scanner.nextInt()); // <-This works.
//int result = funcOp(B.super::Func, scanner.nextInt()); <--This is not working.
//Getting: error: not an enclosing class: B
int result = funcOp(B.super::Func, scanner.nextInt());
^
scanner.close();
System.out.println(result);
}
static int funcOp(MyInterface mI, int num) {
return mI.someFunc(num);
}
}
Скажите, пожалуйста, я неправильно реализую этот код? Из того, что я понял, мы можем передать метод "X" в качестве ссылки на место, где ожидается реализация метода "Y" функционального интерфейса, поскольку метод "X" удовлетворяет условиям и поведению метода "Y" и потенциально может заменить метод «Y» в этой ситуации.
Разве это не правильно, я неправильно получил ссылки на методы?
Спасибо за ваш вклад в это :)