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

Java 我可以显式地键入一个不明确的方法调用并使用它吗?,java,vavr,Java,Vavr,我肯定这在什么地方得到了回答,但我没有足够好的搜索词来找到它。我正在使用io.vavr.control.Try包,当我尝试对结果流中的元素使用GetOrelsThrow方法时,该方法与io.vavr.Value类不明确。我可以指定我想用哪种方法吗,还是不可能 您可以将NotFoundException::new替换为只与函数参数匹配的t->new NotFoundException(t)。由于您没有发布完整的代码,我只能对NotFoundException的外观进行有根据的猜测,但我认为它至少包

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


您可以将
NotFoundException::new
替换为只与函数参数匹配的
t->new NotFoundException(t)

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

public NotFoundException() {}

public NotFoundException(Throwable cause) {
    super(cause);
}
如果要将构造函数方法引用与
Try.getorelsetrow
一起使用,则需要通过删除其中一个构造函数(或潜在地降低可见性)来消除方法引用的不确定性,或者使用lambdas来构造生成的throwable

如果您不能或不想更改
NotFoundException
类,您可以返回使用lambda而不是方法引用(1和2),或者您可以借助vavr函数类型工厂方法创建显式
函数
(2)或
消费者
(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((Value<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))
    .map((Try<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))
    
    .map((值rsp)->rsp.getorelsetrow(NotFoundException::new))
    .map((尝试rsp)->rsp.getorelsetrow(NotFoundException::new))
    

我认为我不够清楚,或者我只是不理解给出的答案。我的主要问题是:一般来说,我能在不编辑任何一个方法的情况下解决方法调用中的歧义吗?如果是这样,我如何告诉编译器使用哪一个?
.map((Value<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))
.map((Try<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))