Могу ли я явно ввести неоднозначный вызов метода и использовать его? - PullRequest
3 голосов
/ 15 октября 2019

Я уверен, что где-то есть ответ, но у меня недостаточно хороших условий поиска, чтобы найти его. Я использую пакет io.vavr.control.Try, и когда я пытаюсь использовать метод getOrElseThrow для элемента в потоке результатов, этот метод неоднозначен с классом io.vavr.Value. Могу ли я указать, какой метод я хочу использовать, или это невозможно?

enter image description here

Ответы [ 3 ]

2 голосов
/ 15 октября 2019

Поскольку вы не опубликовали полный код, я могу только догадываться о том, как выглядит ваш NotFoundException, но я думаю, что он содержит по крайней мере два конструктора в следующей форме:

public NotFoundException() {}

public NotFoundException(Throwable cause) {
    super(cause);
}

Если вы хотите использовать ссылки на методы конструктора с Try.getOrElseThrow, вам необходимо устранить неоднозначность ссылок на методы, удалив один из этих конструкторов (или, возможно, уменьшить видимость), или вернуться к использованию лямбда-выражений для создания результирующего бросаемого объекта.

Если вы не можете или не хотите изменять класс NotFoundException, вы можете либо использовать лямбду вместо ссылки на метод (1 и 2), либо создать явное Function (2) или Consumer (3) экземпляров с помощью фабричных методов типа функции vavr:

rsp.getOrElseThrow(cause -> new NotFoundException(cause)); // (1)
rsp.getOrElseThrow(() -> new NotFoundException());         // (2)
rsp.getOrElseThrow(Function1.of(NotFoundException::new));  // (3)
rsp.getOrElseThrow(Function0.of(NotFoundException::new));  // (4)
2 голосов
/ 17 октября 2019

У вас есть несколько вариантов:

  • Добавить явное приведение к желаемому типу:

    .map(rsp -> rsp.getOrElseThrow((Supplier<NotFoundException>) NotFoundException::new))
    .map(rsp -> rsp.getOrElseThrow((Function<? super Throwable, NotFoundException>) NotFoundException::new))
    
  • Использовать лямбда-выражениевместо ссылки на метод:

    .map(rsp -> rsp.getOrElseThrow(() -> new NotFoundException()))
    .map(rsp -> rsp.getOrElseThrow(t -> new NotFoundException(t)))
    
  • Используйте явный тип внешнего лямбда-параметра:

    .map((Value<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))
    .map((Try<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))
    
2 голосов
/ 15 октября 2019

Вы можете заменить NotFoundException::new на t -> new NotFoundException(t), что будет соответствовать только аргументу функции.

...