docs: private static boolean typesEquivalent(Type typeToMatch, Type type, ResolutionContext ctx) {
          type = ctx.resolve(type);
          if (typeToMatch instanceof ParameterizedType) {
              if (type instanceof ParameterizedType) {
                  return typesEquivalent((ParameterizedType) typeToMatch, (ParameterizedType) type, ctx);
              } else {
                  return false;
              }
          } else {
              if (type instanceof ParameterizedType) {
                  return false;
              }
          }
  
          if (typeToMatch instanceof WildcardType) {
              if (type instanceof WildcardType) {
                  return typesEquivalent((WildcardType) typeToMatch, (WildcardType) type, ctx);
              } else {
                  return false;
              }
          } else {
              if (type instanceof WildcardType) {
                  return false;
              }
          }
  
          if (type instanceof GenericArrayType) {
              return typesEquivalent(typeToMatch, (GenericArrayType) type, ctx);
          }
  
          return typeToMatch.equals(type);
      }