gpt4 book ai didi

java - 为什么 Java 1.8 中的函数式接口(interface)(Function、Supplier、Consumer 等)不会抛出泛型异常?

转载 作者:行者123 更新时间:2023-12-01 18:17:55 25 4
gpt4 key购买 nike

我必须定义自己的可抛出功能接口(interface),例如

@FunctionalInterface
public interface ConsumerEx<T, E extends Exception> {
public void accept(T t) throws E;

public default ConsumerEx<T, E> andThen(ConsumerEx<? super T, ? extends E> after) {
return t -> {
accept(t);
after.accept(t);
};
}
}

但它不能与 forEach 一起使用:-(

最佳答案

功能接口(interface)是通用接口(interface)。但是,具有通用异常的接口(interface)只能在特殊上下文中工作,在该上下文中,您将实例传递给方法,该方法将立即调用该函数并重新抛出异常。

但是,它在任何不立即调用该函数的上下文中都不起作用,例如当它在不同的线程中执行或稍后执行时。

你的特殊消费者正是这样的场景,行不通。您无法编写一个普通的 Consumer 来委托(delegate)给 ConsumerEx 实例并准确捕获为特定 ConsumerEx 实例声明的异常。由于类型删除,您不知道 E 的确切类型。尝试将捕获的异常包装在专门的包装器 RuntimeException 中会更加困难。包装器异常必须是类型参数与 E 匹配的通用异常,但您无法捕获具有类型参数的通用异常。

如果函数接口(interface)允许通用异常类型,这些问题与 JRE 开发人员在并行流执行时面临的问题完全相同。终端操作不可能保证只重新抛出已声明的已检查通用异常。

关于java - 为什么 Java 1.8 中的函数式接口(interface)(Function、Supplier、Consumer 等)不会抛出泛型异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28495504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com