Controllers must define the listener type that receives the event details, and each controller which produces results of a certain type must create Result implementations to supply details to listeners.
A better design would be to normalize how controllers receive the results, and then Controllers are only required to define the result types. One way would be to have a report(Result) method in Controller, and a getInterestedResults(). Another is to use reflection to look up all report(R extends Result) methods.
A set back to having ResultListener<R> is that a controller cannot be interested in multiple result types, which I would like to support.