docs: public boolean matches(Operator<?> operator) {
          final Type expectedType = TypeUtils.unrollVariables(
              TypeUtils.getTypeArguments(operator.getClass(), Operator.class), Operator.class.getTypeParameters()[0]);
  
          if (!TypeUtils.isInstance(this, expectedType)) {
              return false;
          }
          final Map<TypeVariable<?>, Type> typeArguments = TypeUtils.getTypeArguments(expectedType, Operation.class);
          for (Class<?> c : ClassUtils.hierarchy(TypeUtils.getRawType(expectedType, operator.getClass()))) {
              if (c.equals(Operation.class)) {
                  break;
              }
              for (TypeVariable<?> var : c.getTypeParameters()) {
                  Type type = Types.resolveAt(this, var, typeArguments);
                  if (type == null || typeArguments == null) {
                      continue;
                  }
                  if (type instanceof Class<?> && ((Class<?>) type).isPrimitive()) {
                      type = ClassUtils.primitiveToWrapper((Class<?>) type);
                  }
                  if (!TypeUtils.isAssignable(type, TypeUtils.unrollVariables(typeArguments, var))) {
                      return false;
                  }
              }
          }
          return true;
      }