docs: public static ResolvableType forClassWithGenerics(Class<?> sourceClass, ResolvableType... generics) {
          LettuceAssert.notNull(sourceClass, "Source class must not be null");
          LettuceAssert.notNull(generics, "Generics must not be null");
          TypeVariable<?>[] variables = sourceClass.getTypeParameters();
          LettuceAssert.isTrue(variables.length == generics.length, "Mismatched number of generics specified");
  
          Type[] arguments = new Type[generics.length];
          for (int i = 0; i < generics.length; i++) {
              ResolvableType generic = generics[i];
              Type argument = (generic != null ? generic.getType() : null);
              arguments[i] = (argument != null ? argument : variables[i]);
          }
  
          ParameterizedType syntheticType = new SyntheticParameterizedType(sourceClass, arguments);
          return forType(syntheticType, new TypeVariablesVariableResolver(variables, generics));
      }