private <ReplyType extends ResponseMessage> void submit( InetSocketAddress address, RequestMessage<ReplyType> message, DispatchType type, Consumer<ReplyType> consumer) { MessageIdentifier identifier = new MessageIdentifier(unique); message.setIdentifier(identifier); message.setResponseListenerAddress(udpListener.getListeningAddress()); responsesWaiters.put( identifier, responseMessage -> { try { //noinspection unchecked ReplyType casted = (ReplyType) responseMessage; consumer.accept(casted); } catch (ClassCastException e) { logger.warn("Accepted message of wrong type", e); } }); forwardSingle(address, message, type); }