3 回答
TA贡献1946条经验 获得超3个赞
从JLS 9.8起
功能接口是仅具有一种抽象方法的接口,因此表示单个功能协定。
Lambda需要这些功能接口,因此仅限于它们的单一方法。仍然需要使用匿名接口来实现多方法接口。
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
...
}
@Override
public void mousePressed(MouseEvent e) {
...
}
});
TA贡献1836条经验 获得超4个赞
您可以通过使用辅助程序接口将多方法接口与lambda一起使用。这适用于这样的侦听器接口,在这些接口中,不需要的方法的实现是微不足道的(即,我们也可以做MouseAdapter提供的事情):
// note the absence of mouseClicked…
interface ClickedListener extends MouseListener
{
@Override
public default void mouseEntered(MouseEvent e) {}
@Override
public default void mouseExited(MouseEvent e) {}
@Override
public default void mousePressed(MouseEvent e) {}
@Override
public default void mouseReleased(MouseEvent e) {}
}
您只需要定义一次这样的帮助程序接口。
现在,您可以Component c像这样添加点击事件的侦听器:
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
TA贡献1826条经验 获得超6个赞
Lambda EG确实考虑了这个问题。许多库都使用功能接口,即使它们是在功能接口成为现实之前就设计的。但是有时候确实会发生一个类具有多个抽象方法的情况,而您只想使用lambda来定位其中的一个。
此处官方推荐的模式是定义工厂方法:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
这些可以由API本身直接完成(这些可以是内的静态方法MouseListener),也可以是其他一些库中的外部帮助器方法(如果维护者选择不提供这种便利)。因为需要这种情况的情况很小,而且解决方法非常简单,所以似乎并没有要求进一步扩展语言以挽救这种极端情况。
采用了类似的技巧ThreadLocal; 请参阅新的静态工厂方法withInitial(Supplier<S>)。
(顺便说一句,当出现此问题时,示例几乎总是MouseListener,这是令人鼓舞的,因为它表明希望对lambda友好但对lambda友好的类的集合实际上很小。)
添加回答
举报