From 4fe8a1199ef9964ccf34f5e0f21ff5aa2226e2d0 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Wed, 22 Aug 2018 09:30:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DCollectionDecoder=E7=9A=84cre?= =?UTF-8?q?ator=E6=8C=87=E5=AE=9A=E9=94=99=E8=AF=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/CollectionDecoder.java | 4 ++-- src/org/redkale/util/Creator.java | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) 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);