我发现的最优雅的方法是使用匿名桥:
// SAM bridge with lambda implementation window.addWindowListener( WindowBridge.windowOpened( b -> System.out.println("opening via lambda!") ) );与SAM类型的情况类似,它比匿名适配器还干净:
// non-SAM with adapter implementation with override window.addWindowListener( new WindowAdapter() { @Override public void windowOpened(Event e){ System.out.println("WindowAdapter opened via override!"); } } );但是它确实需要带有静态工厂的桥,这有点尴尬:
import java.util.function.Consumer;public interface WindowBridge { // SAM for this method public abstract class WindowOpened extends WindowAdapter { public abstract void windowOpened(Event e); } // factory bridge public static WindowOpened windowOpened(Consumer<Event> c) { return new WindowOpened() { public void windowOpened(Event e){ c.accept(e); } }; } // SAM for this method public abstract class WindowClosing extends WindowAdapter { public abstract void windowClosing(Event e); } // factory bridge public static WindowClosing windowClosing(Consumer<Event> c) { return new WindowClosing() { public void windowClosing(Event e){ c.accept(e); } }; }}


