【问题标题】:Callable<Void> as Functional Interface with lambdasCallable<Void> 作为带有 lambda 的函数式接口
【发布时间】:2014-08-14 09:37:28
【问题描述】:

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

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

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


【解决方案1】:

对于Void 方法(不同于void 方法),您必须返回null。

Void 只是一个占位符,表示您实际上没有返回值(即使构造——比如这里的 Callable——需要一个)。编译器并没有对它进行任何特殊处理,所以你仍然需要自己放入一个“正常”的返回语句。

【讨论】:

  • 聪明。我认为它只是无法确定它应该调用哪一个,并且静态函数应该是通用的,以便为 Callable 提供参数,但我猜不是。你每天都会学到新东西。
  • 是的,很好。 return null 工作正常,但简单的 return 语句不能,我不明白为什么。
  • 编译器不会将Void 视为void。它将它视为任何其他类,因此您需要返回 Void 的一些实例(其中没有),否则,null。
猜你喜欢
  • 2016-03-04
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
相关资源
最近更新 更多