Próbowałem wypróbować programowanie funkcjonalne w Javie. Jednak gdy używam interfejsu funkcjonalnego w klasie jako zmiennej pierwszej klasy, moje zmienne nie są rozpoznawane podczas kompilacji.

Próbowałem ustawić ją jako zmienną lokalną w ramach main, ale otrzymałem te same wyniki.

Czy coś mi umyka?

Kod:

import java.util.function.BiFunction;

class Question {
    static final BiFunction<Integer, Integer, Integer> add = (a,b) -> a+b;

    public static void main(String[] args) {
        System.out.println(Question.add(1,2));
    }
}

Otrzymany błąd:

Question.java:7: error: cannot find symbol
        System.out.println(Question.add(1,2));
                                   ^
  symbol:   method add(int,int)
  location: class Question

Informacje o wersji:

javac 11.0.6
openjdk 11.0.6 2020-01-14
Ubuntu 18.04
3
John C 2 kwiecień 2020, 22:54

3 odpowiedzi

Najlepsza odpowiedź

Question.add(1,2) to wywołanie metody, podczas gdy add to pole.

class Question {
  static final BiFunction<Integer, Integer, Integer> add = (a, b) -> a+b;

  static final int add(int a, int b) {
    return add.apply(a, b);
  }

  public static void main(String[] args) {
    // calls the method
    System.out.println(Question.add(1,2));

    // gets the field and calls BiFunction's method
    System.out.println(Question.add.apply(1,2));
  }
}
2
Andrew Tobilko 2 kwiecień 2020, 20:06

Nie chodzi o to, że nie rozpoznaje add, chodzi o to, że add nie jest metodą - to jest instancja BiConsumer. Nie możesz nazwać tego tak, jakby to była metoda, musisz wywołać jej metodę apply:

System.out.println(Question.add.apply(1,2));
// Here -----------------------^
2
Mureinik 2 kwiecień 2020, 19:57

Nie ma specjalnej składni do wywoływania funkcjonalnych interfejsów .

System.out.println(Question.add(1,2));

Wykonanie wywołania wymaga normalnego wywołania rzeczywistej funkcji.

System.out.println(Question.add.apply(1, 2));

Zmienna add nie musi być kwalifikowana.

System.out.println(add.apply(1, 2));
2
Naman 3 kwiecień 2020, 05:41