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

OLE*_*SHA 4 java syntax lambda

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

例:

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"
Run Code Online (Sandbox Code Playgroud)

我怎么打电话bar(A)打印true

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

Swe*_*per 7

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

A a = (B)() -> someAction();
System.out.println(a instanceof B); // true
Run Code Online (Sandbox Code Playgroud)

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

这听起来像糟糕的设计(虽然我无法解释为什么......).也许你可以isConcurrent在接口中有一个实现者需要实现的方法?