我正在嘗試制作一個采用不同型別例外引數的例外處理程式,我宣告了一個函式型別,它采用任何擴展 Throwable 的型別。它可以在宣告時編譯:
Function<? extends Throwable, Integer> handler = (IllegalStateException e) -> {
return 0;
};
但我無法將 throwable 或任何例外物件傳遞給它,我不明白為什么......
// cannot pass exception object
int result = handler.apply(new IllegalStateException("test"));
任何人都知道如何正確傳遞引數?
[jdk 版本]: 1.8
[錯誤訊息]:我收到 2 條訊息:
型別 Function<capture#6-of 中的方法 apply(capture#6-of ? extends Throwable) extends Throwable,Integer> 不適用于引數 (IllegalStateException)
型別不匹配:無法從 Function<capture#5-of 轉換?將 Throwable,R> 擴展為 Function<Throwable,R>
uj5u.com熱心網友回復:
我正在嘗試創建一個接受不同型別例外引數的例外處理程式,我宣告了一個函式型別,它采用任何擴展 Throwable 的型別
不,你沒有。
您宣告的函式型別:
Function<? extends Throwable, Integer> handler
說“這是一個接受特定子類的函式Throwable- 但我不知道是哪個”。
你不能傳遞任何東西handler.accept從字面上,拋開null,因為編譯器不知道的子類,Throwable你傳遞的是正確的子類Throwable。
例如,這些是合法的分配:
Function<? extends Throwable, Integer> handler1 = (NullPointerException e) -> 0;
Function<? extends Throwable, Integer> handler2 = (IllegalStateException e) -> 0;
但是這些函式只有在分別傳遞 aNullPointerException和 時才能正常作業IllegalStateException。僅給出handler1and handler2,編譯器沒有關于預期型別的??資訊。
接受任何型別的通用函式Throwable是:
Function<Throwable, Integer> handler
不需要界限。
不要忘記 的所有子型別的Throwable實體也是 的實體Throwable。
uj5u.com熱心網友回復:
之后,
我找到了一種可以在沒有編譯錯誤的情況下傳遞引數
并且可以作業的方法。
// the original one
Function<? extends Throwable, Integer> handler = (IllegalStateException e) -> {
System.out.println("handle IllegalStateException, msg: " e.getMessage());
return 0;
};
// cast it to one that accept specific type
// (instead of just a generic type upbound)
Function<Throwable, Integer> handler_ = (Function<Throwable, Integer>) handler;
// perform call on it
handler_.apply(new IllegalStateException("test"));
輸出:
處理 IllegalStateException,訊息:測驗
也許現在已經解決了,
而我不確定是否還有其他更好的解決方案......
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/311544.html
