The Java SE APIs have plenty of interfaces with a single method: java.util.concurrent.Callable,
java.lang.Runnable, javax.swing.ActionListener, etc.
The predefined function asInterfaceInstance can be used to convert a method handle or Golo closure
to an instance of a specific interface.
Here is how one could pass an action listener to a javax.swing.JButton:
let button = JButton("Click me!")
let handler = |event| -> println("Clicked!")
button: addActionListener(asInterfaceInstance(ActionListener.class, handler))Because the asInterfaceInstance call consumes some readability budget, you may refactor it with a
local function as in:
local function listener = |handler| -> asInterfaceInstance(ActionListener.class, handler)
# (...)
let button = JButton("Click me!")
button: addActionListener(listener(|event| -> println("Clicked!")))Here is another example that uses the java.util.concurrent APIs to obtain an executor, pass it a
task, fetch the result with a Future object then shut it down:
function give_me_hey = {
let executor = Executors.newSingleThreadExecutor()
let future = executor: submit(asInterfaceInstance(Callable.class, -> "hey!"))
let result = future: get()
executor: shutdown()
return result
}