我可以显式键入一个模棱两可的方法调用并使用它吗?

时间:2019-10-14 23:29:05

标签: java vavr

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

enter image description here

3 个答案:

答案 0 :(得分:2)

您可以将NotFoundException::new替换为t -> new NotFoundException(t),而后者仅与Function参数匹配。

答案 1 :(得分:2)

由于您没有发布完整的代码,所以我只能对NotFoundException的外观做出有根据的猜测,但是我认为它至少包含以下两种构造函数:

public NotFoundException() {}

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

如果您想对Try.getOrElseThrow使用构造函数方法引用,则需要通过删除这些构造函数之一来消除方法引用的歧义(或可能会降低可见性),或者退一步使用lambda来构造结果抛出。

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

Consumer

答案 2 :(得分:2)

您有很多选择:

  • 将显式类型转换添加到所需的类型:

    .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))