我可以显式键入一个不明确的方法调用并使用它吗?

Can I explicitly type an ambiguous method call and use it?

我确定这在某个地方得到了回答,但我没有足够好的搜索词来找到它。我正在使用 io.vavr.control.Try 包,当我尝试对结果流中的元素使用 getOrElseThrow 方法时,该方法与 io.vavr.Value class 不明确。我可以指定我想以某种方式使用哪种方法,还是不可能?

您可以将 NotFoundException::new 替换为 t -> new NotFoundException(t),这只会匹配 Function 参数。

因为你没有 post 完整的代码,我只能对你的 NotFoundException 的样子做出有根据的猜测,但我认为它至少包含以下形式的两个构造函数:

public NotFoundException() {}

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

如果你想在 Try.getOrElseThrow 中使用构造方法引用,你需要通过删除其中一个构造方法(或可能降低可见性)来消除方法引用的歧义,或者回退到使用 lambdas构建生成的 throwable。

如果您不能或不想更改 NotFoundException class,您可以回退到使用 lambda 而不是方法引用(1 和 2),或者您可以借助 vavr 函数类型工厂方法创建显式 Function(2) 或 Consumer(3) 实例:

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)

您有多种选择:

  • 向所需类型添加显式强制转换:

    .map(rsp -> rsp.getOrElseThrow((Supplier<NotFoundException>) NotFoundException::new))
    .map(rsp -> rsp.getOrElseThrow((Function<? super Throwable, NotFoundException>) NotFoundException::new))
    
  • 使用 lambda 表达式而不是方法引用:

    .map(rsp -> rsp.getOrElseThrow(() -> new NotFoundException()))
    .map(rsp -> rsp.getOrElseThrow(t -> new NotFoundException(t)))
    
  • 使用外层 lambda 参数的显式类型:

    .map((Value<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))
    .map((Try<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))