docs: public static final int compare(final ELContext ctx, final Object obj0, final Object obj1)
              throws ELException {
          if (obj0 == obj1 || equals(ctx, obj0, obj1)) {
              return 0;
          }
          if (isBigDecimalOp(obj0, obj1)) {
              BigDecimal bd0 = (BigDecimal) coerceToNumber(ctx, obj0, BigDecimal.class);
              BigDecimal bd1 = (BigDecimal) coerceToNumber(ctx, obj1, BigDecimal.class);
              return bd0.compareTo(bd1);
          }
          if (isDoubleOp(obj0, obj1)) {
              Double d0 = (Double) coerceToNumber(ctx, obj0, Double.class);
              Double d1 = (Double) coerceToNumber(ctx, obj1, Double.class);
              return d0.compareTo(d1);
          }
          if (isBigIntegerOp(obj0, obj1)) {
              BigInteger bi0 = (BigInteger) coerceToNumber(ctx, obj0, BigInteger.class);
              BigInteger bi1 = (BigInteger) coerceToNumber(ctx, obj1, BigInteger.class);
              return bi0.compareTo(bi1);
          }
          if (isLongOp(obj0, obj1)) {
              Long l0 = (Long) coerceToNumber(ctx, obj0, Long.class);
              Long l1 = (Long) coerceToNumber(ctx, obj1, Long.class);
              return l0.compareTo(l1);
          }
          if (obj0 instanceof String || obj1 instanceof String) {
              return coerceToString(ctx, obj0).compareTo(coerceToString(ctx, obj1));
          }
          if (obj0 instanceof Comparable<?>) {
              @SuppressWarnings("unchecked") // checked above
              final Comparable<Object> comparable = (Comparable<Object>) obj0;
              return (obj1 != null) ? comparable.compareTo(obj1) : 1;
          }
          if (obj1 instanceof Comparable<?>) {
              @SuppressWarnings("unchecked") // checked above
              final Comparable<Object> comparable = (Comparable<Object>) obj1;
              return (obj0 != null) ? -comparable.compareTo(obj0) : -1;
          }
          throw new ELException(MessageFactory.get("error.compare", obj0, obj1));
      }