code: public <T> T giveOther(TypeTag tag, T value) {
          Class<T> type = tag.getType();
          if (value != null && !type.isAssignableFrom(value.getClass()) && !wraps(type, value.getClass())) {
              throw new ReflectionException("TypeTag does not match value.");
          }
  
          Tuple<T> tuple = giveTuple(tag);
          if (tuple.getRed() == null) {
              return null;
          }
          if (type.isArray() && arraysAreDeeplyEqual(tuple.getRed(), value)) {
              return tuple.getBlack();
          }
          if (!type.isArray() && tuple.getRed().equals(value)) {
              return tuple.getBlack();
          }
          return tuple.getRed();
      }
docs: Returns a prefabricated value of the specified type, that is different
  from the specified value.
  
  @param <T> The type of the value.
  @param tag A description of the desired type, including generic
  parameters.
  @param value A value that is different from the value that will be
  returned.
  @return A value that is different from {@code value}.