Java 可调用<;无效>;作为与lambdas的功能接口

Java 可调用<;无效>;作为与lambdas的功能接口,java,lambda,java-8,void,callable,Java,Lambda,Java 8,Void,Callable,我正在学习java8的新特性。我的问题是: 为什么不允许使用Callable作为lambda表达式的函数接口?(编译器抱怨返回值) 在那里使用Callable仍然是完全合法的。以下是示例代码: public class Test { public static void main(String[] args) throws Exception { // works fine testInt(() -> { System.out

我正在学习java8的新特性。我的问题是:

为什么不允许使用
Callable
作为lambda表达式的函数接口?(编译器抱怨返回值) 在那里使用
Callable
仍然是完全合法的。以下是示例代码:

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();
    }
}
公共类测试{
公共静态void main(字符串[]args)引发异常{
//很好
测试(()->{
System.out.println(“来自测试方法”);
返回1;
});
testVoid(()->{
System.out.println(“来自testVoid方法”);
//错误!无法返回无效?
});
}
公共静态void testInt(Callable Callable)引发异常{
callable.call();
}
公共静态void testVoid(Callable Callable)引发异常{
callable.call();
}
}

如何解释此行为?

对于
Void
方法(与
Void
方法不同),必须返回
null


Void
只是一个占位符,表明您实际上没有返回值(即使构造(如此处的Callable)需要一个返回值)。编译器不会以任何特殊方式处理它,因此您仍然需要自己输入一个“正常”返回语句。

Smart。我想它只是不知道应该调用哪一个,静态函数应该是泛型的,为Callable提供参数,但我想不是。你每天都能学到新东西。是的,很好
returnnull
工作正常,但simple
return
语句不行,我不明白为什么。编译器不会像对待
Void
一样对待
Void
。它像对待任何其他类一样对待它,因此您需要返回
Void
(其中没有)的某个实例,否则,
null
。如果没有返回值,您不能在这里使用
Runnable
?(我还不熟悉Java8)@Thilo:使用Callable的一个好处是,它返回一个未来,以后可以用于其他目的,例如在运行时间过长时终止一个任务。此外,Callable可以抛出未检查的异常,而Runnable不能