public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
    final Type type = typeToken.getType();
    Class<? super T> rawType = typeToken.getRawType();

    final InstanceCreator<T> typeCreator = (InstanceCreator) this.instanceCreators.get(type);
    if (typeCreator != null) {
      new ObjectConstructor() {
        public T construct() {
          return (T) typeCreator.createInstance(type);
        }
      };
    }
    final InstanceCreator<T> rawTypeCreator = (InstanceCreator) this.instanceCreators.get(rawType);
    if (rawTypeCreator != null) {
      new ObjectConstructor() {
        public T construct() {
          return (T) rawTypeCreator.createInstance(type);
        }
      };
    }
    ObjectConstructor<T> defaultConstructor = newDefaultConstructor(rawType);
    if (defaultConstructor != null) {
      return defaultConstructor;
    }
    ObjectConstructor<T> defaultImplementation = newDefaultImplementationConstructor(type, rawType);
    if (defaultImplementation != null) {
      return defaultImplementation;
    }
    return newUnsafeAllocator(type, rawType);
  }
 private <T> ObjectConstructor<T> newDefaultImplementationConstructor(
     final Type type, Class<? super T> rawType) {
   if (Collection.class.isAssignableFrom(rawType)) {
     if (SortedSet.class.isAssignableFrom(rawType)) {
       new ObjectConstructor() {
         public T construct() {
           return new TreeSet();
         }
       };
     }
     if (EnumSet.class.isAssignableFrom(rawType)) {
       new ObjectConstructor() {
         public T construct() {
           if ((type instanceof ParameterizedType)) {
             Type elementType = ((ParameterizedType) type).getActualTypeArguments()[0];
             if ((elementType instanceof Class)) {
               return EnumSet.noneOf((Class) elementType);
             }
             throw new JsonIOException("Invalid EnumSet type: " + type.toString());
           }
           throw new JsonIOException("Invalid EnumSet type: " + type.toString());
         }
       };
     }
     if (Set.class.isAssignableFrom(rawType)) {
       new ObjectConstructor() {
         public T construct() {
           return new LinkedHashSet();
         }
       };
     }
     if (Queue.class.isAssignableFrom(rawType)) {
       new ObjectConstructor() {
         public T construct() {
           return new LinkedList();
         }
       };
     }
     new ObjectConstructor() {
       public T construct() {
         return new ArrayList();
       }
     };
   }
   if (Map.class.isAssignableFrom(rawType)) {
     if (SortedMap.class.isAssignableFrom(rawType)) {
       new ObjectConstructor() {
         public T construct() {
           return new TreeMap();
         }
       };
     }
     if (((type instanceof ParameterizedType))
         && (!String.class.isAssignableFrom(
             TypeToken.get(((ParameterizedType) type).getActualTypeArguments()[0])
                 .getRawType()))) {
       new ObjectConstructor() {
         public T construct() {
           return new LinkedHashMap();
         }
       };
     }
     new ObjectConstructor() {
       public T construct() {
         return new LinkedTreeMap();
       }
     };
   }
   return null;
 }