class Temp { interface Future<F> {} class Message { } interface Client<C extends Client, M> { <T> Future<T> request(M request); } interface MessageClient extends Client<MessageClient, Message> { Future<Message> request(Message request); } abstract class AbstractClient implements MessageClient { } class ConcreteClient extends AbstractClient { public Future<Message> request(Message request) { return null; } } }