This pattern allows one to use "ADT" in Java.
You publish a TileEvent, and you use instanceof to know which kind of event it is.
TileEvent tileEvent = (TileEvent) object;
if (tileEvent instanceof TileEvent.Set) {
    TileEvent.Set event = (TileEvent.Set) tileEvent;
    System.out.printf("Set Event at %s on level %s with sprite %s",
            event.getPosition(), event.getLevel(), event.getSprite());
}