docs: public static ClassNode parameterizeType(final ClassNode hint, final ClassNode target) {
          if (hint.isArray()) {
              if (target.isArray()) {
                  return parameterizeType(hint.getComponentType(), target.getComponentType()).makeArray();
              }
              return target;
          }
          if (!target.equals(hint) && implementsInterfaceOrIsSubclassOf(target, hint)) {
              ClassNode nextSuperClass = ClassHelper.getNextSuperClass(target, hint);
              if (!hint.equals(nextSuperClass)) {
                  Map<String, ClassNode> genericsSpec = createGenericsSpec(hint);
                  extractSuperClassGenerics(hint, nextSuperClass, genericsSpec);
                  ClassNode result = correctToGenericsSpecRecurse(genericsSpec, nextSuperClass);
                  return parameterizeType(result, target);
              }
          }
          Map<String, ClassNode> genericsSpec = createGenericsSpec(hint);
          ClassNode targetRedirect = target.redirect();
          genericsSpec = createGenericsSpec(targetRedirect, genericsSpec);
          extractSuperClassGenerics(hint, targetRedirect, genericsSpec);
          return correctToGenericsSpecRecurse(genericsSpec, targetRedirect);
  
      }