我有一個加載屬性文件的 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 等),甚至沒有鏈接原始原因,這使得在運行時診斷問題變得非常困難。
添加回答
舉報
0/150
提交
取消