考虑功能接口A
和B 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
,则会同时调用它。
答案 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);