簡體   English   中英

使用使用者時無法解析方法

[英]Cannot resolve method when using consumer

我有一個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);

坦率地說,我認為您是在濫用消費者,而且一個好的老式嘗試擋塊會使事情更容易閱讀。 當您無法從InputStream讀取時,UnsupportedOperationException也不是要加載的正確異常。 UncheckedIOException將更加整潔。 您的使用者還捕獲了它不應該捕獲的異常(例如NullPointerException或OutOfMemoryError等),甚至沒有鏈接到原始原因,這使得在運行時很難診斷問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM