class SO52915280 {
StringCommandBusRequest request = new StringCommandBusRequest();
Bus<CommandBus> bus = new CommandBus();
String result
= bus.
execute(request
); }
public interface Bus<B extends Bus<B>> {
<R, Q extends BusRequest<R, B>> R execute(Q request);
}
public interface BusRequest<R, B extends Bus<B>> {}
public static class CommandBus implements Bus<CommandBus> {
@Override
public <R, Q extends BusRequest<R, CommandBus>> R execute(Q request) {
System.
out.
println("Got request of type: " + request.
getClass()); return null;
}
}
public interface CommandBusRequest<T> extends BusRequest<T, CommandBus> {}
public static class StringCommandBusRequest implements CommandBusRequest<String> {}
}
Y2xhc3MgU081MjkxNTI4MCB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmdDb21tYW5kQnVzUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFN0cmluZ0NvbW1hbmRCdXNSZXF1ZXN0KCk7CiAgICAgICAgQnVzPENvbW1hbmRCdXM+IGJ1cyA9IG5ldyBDb21tYW5kQnVzKCk7CiAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGJ1cy5leGVjdXRlKHJlcXVlc3QpOwogICAgfQoKICAgIHB1YmxpYyBpbnRlcmZhY2UgQnVzPEIgZXh0ZW5kcyBCdXM8Qj4+IHsKICAgICAgICA8UiwgUSBleHRlbmRzIEJ1c1JlcXVlc3Q8UiwgQj4+IFIgZXhlY3V0ZShRIHJlcXVlc3QpOwogICAgfQoKICAgIHB1YmxpYyBpbnRlcmZhY2UgQnVzUmVxdWVzdDxSLCBCIGV4dGVuZHMgQnVzPEI+PiB7fQoKCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRCdXMgaW1wbGVtZW50cyBCdXM8Q29tbWFuZEJ1cz4gewogICAgCUBPdmVycmlkZQogICAgCXB1YmxpYyA8UiwgUSBleHRlbmRzIEJ1c1JlcXVlc3Q8UiwgQ29tbWFuZEJ1cz4+IFIgZXhlY3V0ZShRIHJlcXVlc3QpIHsKICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJHb3QgcmVxdWVzdCBvZiB0eXBlOiAiICsgcmVxdWVzdC5nZXRDbGFzcygpKTsKICAgIAkgICAgcmV0dXJuIG51bGw7CiAgICAJfQogICAgfQoKICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEJ1c1JlcXVlc3Q8VD4gZXh0ZW5kcyBCdXNSZXF1ZXN0PFQsIENvbW1hbmRCdXM+IHt9CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdDb21tYW5kQnVzUmVxdWVzdCBpbXBsZW1lbnRzIENvbW1hbmRCdXNSZXF1ZXN0PFN0cmluZz4ge30KfQ==