我可以显式键入一个不明确的方法调用并使用它吗?
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))
我确定这在某个地方得到了回答,但我没有足够好的搜索词来找到它。我正在使用 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))