Ссылка на метод является неоднозначной ссылкой на метод против лямбды - PullRequest
0 голосов
/ 03 мая 2018

У меня есть следующие классы

интерфейс 1

 package test;

    public interface TODO {

        boolean test();
    }

интерфейс 2

package test;

@FunctionalInterface
public interface FuncN {
  State zip(State ...states);
}

класс 1

package test;

public class Test {

    public static Test define(FuncN zipperFunc,TODO... tasks) {
        return null;
    }


    public static Test define(TODO... tasks) {
        return null;
    }
}

класс 2

пакетный тест;

public class State {
    public static State mergeStates(State ...states) {
        return null;
    }
}

основной класс

package test;

public class Main {
    public static void main(String[] args) {
      Test.define(State::mergeStates,()->true);
    }
}

Класс main не компилируется, выдает ошибку

ссылка на определение неоднозначна Test.define (Государство :: mergeStates, () -> истина); ^ определение метода (FuncN, TODO ...) в тесте и определение метода (TODO ...) в тестовом совпадении

Класс ниже компилируется:

package test;

public class Main {
    public static void main(String[] args) {
      Test.define(states->State.mergeStates(states),()->true);
    }
}

Однако я не вижу никакой двусмысленности. Сигнатуры FuncN и TODO совершенно разные, я не думаю, что компилятор должен принимать их друг за друга.

Поправь меня, если я ошибаюсь.

P.S. Ошибка не воспроизводится с помощью eclipse, поэтому я бы порекомендовал создать тест папки, создав в ней все java-файлы и запустить javac test / Main.java

1 Ответ

0 голосов
/ 03 мая 2018

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

    public static void main(String[] args){
      Test.define((FuncN) State::mergeStates,()->true);
    }
...