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

时间:2019-07-06 16:17:03

标签: java

我有一个InputStream可以加载属性文件。通常我使用properties.load(is);,但是我想将其更改为Consumer,因为我希望避免使用catch,因此我创建了一个避免id的ThrowingConsumer,但是问题是,即使我使用普通的Consumer似乎也可以正常工作我声明这将是一个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);时,尖叫着无法解决方法负载。我该如何避免呢?

1 个答案:

答案 0 :(得分:3)

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