我有一个加载属性文件的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);时,它的尖叫无法解决方法负载。我怎么能避免它?

分析解答

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

使用lambda:

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

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

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

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