// runnable can take an argument (Pt) static A onLeftClick(final A c, fO runnable) { swing { c.addMouseListener(leftClickMouseAdapter(runnable)); } ret c; } // runnable takes no args static TrayIcon onLeftClick(final TrayIcon c, final O runnable) { swing { c.addMouseListener(leftClickMouseAdapter_noPt(runnable)); } ret c; } static A onLeftClick(fO runnable, A c) { ret onLeftClick(c, runnable); } static A onLeftClick(Runnable runnable, A c) { ret onLeftClick((O) runnable, c); } static A onLeftClick(A c, Runnable r) { ret onLeftClick(r, c); } static A onLeftClick(A c, IVF1 r) { ret onLeftClick(c, (O) r); }