code: @SuppressWarnings("unchecked") // use runtime checks to guarantee that 'T' is what it is
    private <T> ObjectConstructor<T> newDefaultImplementationConstructor(Class<? super T> rawType) {
      if (Collection.class.isAssignableFrom(rawType)) {
        if (SortedSet.class.isAssignableFrom(rawType)) {
          return new ObjectConstructor<T>() {
            public T construct() {
              return (T) new TreeSet<Object>();
            }
          };
        } else if (Set.class.isAssignableFrom(rawType)) {
          return new ObjectConstructor<T>() {
            public T construct() {
              return (T) new LinkedHashSet<Object>();
            }
          };
        } else if (Queue.class.isAssignableFrom(rawType)) {
          return new ObjectConstructor<T>() {
            public T construct() {
              return (T) new LinkedList<Object>();
            }
          };
        } else {
          return new ObjectConstructor<T>() {
            public T construct() {
              return (T) new ArrayList<Object>();
            }
          };
        }
      }
  
      if (Map.class.isAssignableFrom(rawType)) {
        return new ObjectConstructor<T>() {
          public T construct() {
            return (T) new LinkedHashMap<Object, Object>();
          }
        };
        // TODO: SortedMap ?
      }
  
      return null;
    }
docs: Constructors for common interface types like Map and List and their
  subytpes.