【发布时间】:2014-08-14 09:37:28
【问题描述】:
我只是在学习新的 java8 特性。这是我的问题:
为什么不允许使用Callable<Void> 作为 lambda 表达式的函数接口? (编译器抱怨返回值)
在那里使用Callable<Integer> 仍然是完全合法的。下面是示例代码:
public class Test {
public static void main(String[] args) throws Exception {
// works fine
testInt(() -> {
System.out.println("From testInt method");
return 1;
});
testVoid(() -> {
System.out.println("From testVoid method");
// error! can't return void?
});
}
public static void testInt(Callable<Integer> callable) throws Exception {
callable.call();
}
public static void testVoid(Callable<Void> callable) throws Exception {
callable.call();
}
}
如何解释这种行为?
【问题讨论】:
-
如果你没有返回值,你不能在这里使用
Runnable吗? (我对Java8还不熟悉) -
@Thilo:使用 Callable 的一个好处是它返回一个 Future,以后可以将其用于其他目的,例如终止运行时间过长的任务。
-
Callable 也可以抛出未经检查的异常,而 Runnable 则不能
标签: java lambda java-8 void callable