docs: public static ClassNode findParameterizedType(ClassNode genericsClass, ClassNode actualType, boolean tryToFindExactType) {
          ClassNode parameterizedType = null;
  
          if (null == genericsClass.getGenericsTypes()) {
              return parameterizedType;
          }
  
          GenericsType[] declaringGenericsTypes = genericsClass.getGenericsTypes();
  
          List<ClassNode> classNodeList = new LinkedList<>(getAllSuperClassesAndInterfaces(actualType));
          classNodeList.add(0, actualType);
  
          LinkedList<ClassNode> parameterizedTypeCandidateList = new LinkedList<>();
  
          for (ClassNode cn : classNodeList) {
              if (cn == genericsClass) {
                  continue;
              }
  
              if (tryToFindExactType && null != cn.getGenericsTypes() && hasNonPlaceHolders(cn)) {
                  parameterizedTypeCandidateList.add(cn);
              }
  
              if (!(genericsClass.equals(cn.redirect()))) {
                  continue;
              }
  
              if (isGenericsTypeArraysLengthEqual(declaringGenericsTypes, cn.getGenericsTypes())) {
                  parameterizedType = cn;
                  break;
              }
          }
  
          if (null == parameterizedType) {
              if (!parameterizedTypeCandidateList.isEmpty()) {
                  parameterizedType = parameterizedTypeCandidateList.getLast();
              }
          }
  
          return parameterizedType;
      }