Ошибка при сохранении функции stati c из другого класса в BiFunction - PullRequest
0 голосов
/ 27 мая 2020

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

Я пробовал следующий прототип, который приводит к ошибке компиляции:

class A {
    public String myFn(int a, int b) {
        return "<" + a + " " + b + ">";
    }
    public String myFn2(int a, int b) {
        return "(" + a + " " + b + ")";
    }
}

class B {
    static int mode = 1;
    public void fn() {
        BiFunction<Integer, Integer, String> fn = null;
        if(mode == 1) {
            fn = ClassA.myFn(); // This results in an error "Cannot resolve method fn()".
        }
        else {
            //fn = ClassA.myFn2();
        }

        // next I will use fn ...

    }
}

Это приводит к ошибке «Не удается разрешить метод fn () ".

Как сохранить функцию?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Вызов ClassA.myFn() потребует, чтобы метод был c и это вызов метода, вы не хотите сохранять метод, а не вызывать его.

  1. Лямбда

    BiFunction<Integer, Integer, String> fn = null;
    if(mode == 1) {
        fn = (a, b) -> ClassA.myFn(a, b); 
    }
    
  2. Ссылка на метод

    BiFunction<Integer, Integer, String> fn = null;
    if(mode == 1) {
        fn = ClassA::myFn; 
    }
    

⚠️ Также

  • оба myFn и myFn2 должны соответствовать c

    public static String myFn(int a, int b) {
        return "<" + a + " " + b + ">";
    }
    
  • chosse ClassA или A, но они должны соответствовать

    class ClassA {
    
1 голос
/ 27 мая 2020

Ваш метод myFn не является stati c, поэтому вы не можете получить к нему доступ в контексте stati c, как вы пытаетесь это сделать. Ваш класс также называется A, но вы ссылаетесь на него как ClassA. Кроме того, присваивая BiFunction, вы назначаете его возвращаемому значению, когда вам нужно лямбда-выражение. Вот отредактированная копия вашего примера:

class A {
    public static String myFn(int a, int b) { //notice the static keyword
        return "<" + a + " " + b + ">";
    }
    public static String myFn2(int a, int b) { //notice the static keyword
        return "(" + a + " " + b + ")";
    }
}

class B {
    static int mode = 1;
    public void fn() {
        BiFunction<Integer, Integer, String> fn = null;
        if(mode == 1) {
            fn = A::myFn; // use a lambda expression, and class is named A
        }
        else {
            //fn = A::myFn2;
        }

        // next I will use fn ...

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