为了账号安全,请及时绑定邮箱和手机立即绑定

使用消费者时无法解析方法

使用消费者时无法解析方法

桃花长相依 2023-03-09 16:44:22
我有一个加载属性文件的 InputStream。通常我使用properties.load(is);但我想将它更改为 Consumer 因为我想避免使用 catches 所以我创建了一个避免 id 的 ThrowingConsumer,但问题是即使我使用普通的 Consumer 它似乎在我声明时工作一个 InputStream,但我的 ThrowingConsumer 是通用的,所以它看起来像那样@FunctionalInterfacepublic interface ThrowingConsumer<T, E extends Throwable>{    void accept(T t) throws E;    static <T, E extends Throwable> Consumer<T> unchecked(ThrowingConsumer<T, E> consumer)    {        return t ->        {            try            {                consumer.accept(t);            }            catch (Throwable e)            {                throw new UnsupportedOperationException(e);            }        };    }}当我使用ThrowingConsumer.unchecked(properties::load).accept(is);它时,它尖叫着无法解析方法加载。我怎么能避免呢?
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

load() 方法被重载,因此推理无法在两个重载之间进行选择。

使用 lambda:

ThrowingConsumer.unchecked((InputStream i) -> properties.load(i)).accept(is);

或将您的方法引用转换为正确的类型:

ThrowingConsumer.unchecked((ThrowingConsumer<InputStream, IOException>) properties::load).accept(is);

坦率地说,我认为你在这里滥用消费者,一个好的旧 try catch 块会让事情更容易阅读。当您无法从 InputStream 读取时,UnsupportedOperationException 也根本不是要加载的正确异常。UncheckedIOException 会干净得多。而且您的消费者还会捕获它不应该捕获的异常(例如 NullPointerException 或 OutOfMemoryError 等),甚至没有链接原始原因,这使得在运行时诊断问题变得非常困难。


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信