diff --git a/src/org/redkale/convert/CollectionDecoder.java b/src/org/redkale/convert/CollectionDecoder.java index 2bb36bbf3..79702685d 100644 --- a/src/org/redkale/convert/CollectionDecoder.java +++ b/src/org/redkale/convert/CollectionDecoder.java @@ -46,7 +46,7 @@ public class CollectionDecoder implements Decodeable> { this.decoder = factory.loadDecoder(this.componentType); } else if (factory.isReversible()) { this.componentType = Object.class; - this.creator = factory.loadCreator(Object.class); + this.creator = factory.loadCreator(type instanceof Class ? (Class) type : Collection.class); factory.register(type, this); this.decoder = factory.loadDecoder(this.componentType); } else { @@ -111,7 +111,7 @@ public class CollectionDecoder implements Decodeable> { protected Reader getItemReader(Reader in, DeMember member, boolean first) { return in; } - + protected T readMemberValue(Reader in, DeMember member, boolean first) { return this.decoder.convertFrom(in); } diff --git a/src/org/redkale/util/Creator.java b/src/org/redkale/util/Creator.java index 0f48da229..77b260f68 100644 --- a/src/org/redkale/util/Creator.java +++ b/src/org/redkale/util/Creator.java @@ -77,6 +77,7 @@ public interface Creator { static final Map creatorCacheMap = new HashMap<>(); static { + creatorCacheMap.put(Object.class, (params) -> new Object()); creatorCacheMap.put(ArrayList.class, (params) -> new ArrayList<>()); creatorCacheMap.put(HashMap.class, (params) -> new HashMap<>()); creatorCacheMap.put(HashSet.class, (params) -> new HashSet<>()); @@ -212,13 +213,13 @@ public interface Creator { */ @SuppressWarnings("unchecked") public static Creator create(Class clazz) { - if (clazz.isAssignableFrom(ArrayList.class)) { + if (Collection.class.isAssignableFrom(clazz) && (clazz.isAssignableFrom(ArrayList.class) || clazz.getName().startsWith("java.util.Collections") || clazz.getName().startsWith("java.util.ImmutableCollections") || clazz.getName().startsWith("java.util.Arrays"))) { clazz = (Class) ArrayList.class; - } else if (clazz.isAssignableFrom(HashMap.class)) { + } else if (Map.class.isAssignableFrom(clazz) && (clazz.isAssignableFrom(HashMap.class) || clazz.getName().startsWith("java.util.Collections") || clazz.getName().startsWith("java.util.ImmutableCollections"))) { clazz = (Class) HashMap.class; - } else if (clazz.isAssignableFrom(HashSet.class)) { + } else if (Set.class.isAssignableFrom(clazz) && (clazz.isAssignableFrom(HashSet.class) || clazz.getName().startsWith("java.util.Collections") || clazz.getName().startsWith("java.util.ImmutableCollections"))) { clazz = (Class) HashSet.class; - } else if (clazz.isAssignableFrom(ConcurrentHashMap.class)) { + } else if (Map.class.isAssignableFrom(clazz) && clazz.isAssignableFrom(ConcurrentHashMap.class)) { clazz = (Class) ConcurrentHashMap.class; } Creator creator = CreatorInner.creatorCacheMap.get(clazz);