首页 > 解决方案 > 使用消费者时无法解析方法

问题描述

我有一个加载属性文件的 InputStream。通常我使用properties.load(is);但我想将其更改为消费者,因为我想避免使用捕获,所以我创建了一个避免 id 的 ThrowingConsumer,但问题是即使我使用普通消费者,当我声明它将是一个 InputStream,但我的 ThrowingConsumer 是通用的,所以看起来像这样

@FunctionalInterface
public 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);它时,它会尖叫无法解决方法加载。我怎么能避免呢?

标签: java

解决方案


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 等),甚至没有链接原始原因,这使得在运行时诊断问题变得非常困难。


推荐阅读