我發現了一些得體通過合理的Eclipse JDT但似乎並沒有被定義任何地方:Java 8 lambda:默認情況下是自動推斷的異常RuntimeException?
<!-- language: lang-java -->
public static <T, TException extends Exception> void iterateEx(
Iterable<T> iterable, PredicateEx<T, TException> step) throws TException
{
for (T item : iterable)
{
if (step.testEx(item))
{
ThreadExt.yield(); // sleep 0.001s
}
}
}
當我打電話用的λ爲PredicateEx 步,未指定TException假設的方法如果lambda拋出任何東西,則爲RuntimeException。我在Eclipse JDT中找到了這段代碼,但它是lambda類型推斷中的一個明確定義的行爲,還是隻是在編譯器實現中做出的一些決定?因爲默認的異常也可能是Exception(= TException的上限),我很擔心,因爲我要重寫所有函數接收方法來正確處理檢查的異常。
呼叫者的實例是這樣的:
<!-- language: lang-java -->
iterateEx(listOfResultSet, rs -> true); // throws RuntimeException, no try-catch required
iterateEx(listOfResultSet, rs -> rs.getBoolean("SOME_COLUMN")); // throws SQLException
的PredicateEx是謂詞的變體,其允許例外的投擲:
<!-- language: lang-java -->
@FunctionalInterface
public interface PredicateEx<T, TException extends Exception>
{
boolean testEx(T t) throws TException;
}
這不是一個真正的lambda問題 - 任何行爲都將在[規範的泛型部分]中指定(http://docs.oracle.com/javase/specs/jls/se8/html/jls-8。 HTML#d5e13058)。 Java重寫方法/實現方法來縮小異常聲明是正常的。 – McDowell 2014-10-22 07:34:00
它與來自lambda的類型推斷有關 - 如果沒有引發或者拋出多於一種類型的異常,應該推斷出的TException是什麼? – AqD 2014-10-22 12:42:02