@Override
  public List<MethodMetadata> parseAndValidateMetadata(final Class<?> targetType) {
    checkNotNull(targetType, "Argument targetType must be not null");

    final List<MethodMetadata> metadatas = delegate.parseAndValidateMetadata(targetType);

    for (final MethodMetadata metadata : metadatas) {
      final Type type = metadata.returnType();

      if (type instanceof ParameterizedType
          && ((ParameterizedType) type).getRawType().equals(Future.class)) {
        final Type actualType = resolveLastTypeParameter(type, Future.class);
        metadata.returnType(actualType);
      } else {
        throw new IllegalStateException(
            String.format(
                "Method %s of contract %s doesn't returns io.vertx.core.Future",
                metadata.configKey(), targetType.getSimpleName()));
      }
    }

    return metadatas;
  }
Contract allowing only {@link Future} return type.

@author Alexei KLENIN
vertx/feign-vertx/src/main/java/feign/vertx/VertxDelegatingContract.java