code: @SuppressWarnings("unchecked")
    public static <K, V> MapDifference<K, V> difference(
        Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
      if (left instanceof SortedMap) {
        SortedMap<K, ? extends V> sortedLeft = (SortedMap<K, ? extends V>) left;
        SortedMapDifference<K, V> result = difference(sortedLeft, right);
        return result;
      }
      return difference(left, right, Equivalence.equals());
    }
docs: Computes the difference between two maps. This difference is an immutable
  snapshot of the state of the maps at the time this method is called. It
  will never change, even if the maps change at a later time.
  
  <p>Since this method uses {@code HashMap} instances internally, the keys of
  the supplied maps must be well-behaved with respect to
  {@link Object#equals} and {@link Object#hashCode}.
  
  <p><b>Note:</b>If you only need to know whether two maps have the same
  mappings, call {@code left.equals(right)} instead of this method.
  
  @param left the map to treat as the "left" map for purposes of comparison
  @param right the map to treat as the "right" map for purposes of comparison
  @return the difference between the two maps