//if they were supported (they're not, are they?), they could be used // e.g. like this: enum EventType{MOUSE_MOVED, MOUSE_CLICKED, KEY_PRESSED}; interface Listener { } interface MouseMovedListener extends Listener { void mouseMoved(...); } interface MouseClickedListener extends Listener { void mouseClicked(...); } interface KeyPressedListener extends Listener { void keyPressed(...); } class MyComponent { void registerListener(eventType type, Listener listener) { ..... } } usage e.g. MyComponent myComponent = ....; myComponent.registerListener(MOUSE_CLICKED, new MouseClickedListener() {.....}); compiler checks that 2nd argument to registerListener matches the 1st argument. ...or maybe even just: class MyComponent { void registerListener(Listener listener) { ..... } } MyComponent myComponent = ....; myComponent.registerListener(new MouseClickedListener() {.....}); no?