Java lambda表达式 - 显式目标类型

时间:2018-06-04 13:47:33

标签: java lambda syntax

考虑功能接口AB extends A。当仅需要A时,是否可以创建一个不仅实现B而且还使用lambda表达式实现A的实例?

示例:

interface A {
    void foo();
}

interface B extends A {}

void bar(A arg) {
    System.out.println(arg instanceof B);
}

/* somewhere in a block */
    bar( () -> {} ); // Prints "false"

如何调用bar(A)以便打印true

我会发现这在事件侦听器中很有用,其中子接口可以指定有关侦听器的其他数据,例如:如果Listener也实现ConcurrentListener,则会同时调用它。

2 个答案:

答案 0 :(得分:7)

只需进行强制转换即可告诉编译器您想要的类型:

SELECT
  

我会发现这在事件侦听器中很有用,其中子接口可以指定有关侦听器的其他数据,例如:如果Listener也实现了ConcurrentListener,则会同时调用它。

这听起来像是糟糕的设计(虽然我无法解释为什么......)。也许你可以在实现者需要实现的界面中使用A a = (B)() -> someAction(); System.out.println(a instanceof B); // true 方法?

答案 1 :(得分:2)

您可以将lambda表达式显式地转换为B:

bar((B)() -> {});

或将lambda表达式赋给变量:

B lambda = () -> {};
bar(lambda);