修复CollectionDecoder的creator指定错误的bug

This commit is contained in:
Redkale
2018-08-22 09:30:11 +08:00
parent 7312dbc4c5
commit 4fe8a1199e
2 changed files with 7 additions and 6 deletions

View File

@@ -46,7 +46,7 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
this.decoder = factory.loadDecoder(this.componentType); this.decoder = factory.loadDecoder(this.componentType);
} else if (factory.isReversible()) { } else if (factory.isReversible()) {
this.componentType = Object.class; 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); factory.register(type, this);
this.decoder = factory.loadDecoder(this.componentType); this.decoder = factory.loadDecoder(this.componentType);
} else { } else {

View File

@@ -77,6 +77,7 @@ public interface Creator<T> {
static final Map<Class, Creator> creatorCacheMap = new HashMap<>(); static final Map<Class, Creator> creatorCacheMap = new HashMap<>();
static { static {
creatorCacheMap.put(Object.class, (params) -> new Object());
creatorCacheMap.put(ArrayList.class, (params) -> new ArrayList<>()); creatorCacheMap.put(ArrayList.class, (params) -> new ArrayList<>());
creatorCacheMap.put(HashMap.class, (params) -> new HashMap<>()); creatorCacheMap.put(HashMap.class, (params) -> new HashMap<>());
creatorCacheMap.put(HashSet.class, (params) -> new HashSet<>()); creatorCacheMap.put(HashSet.class, (params) -> new HashSet<>());
@@ -212,13 +213,13 @@ public interface Creator<T> {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> Creator<T> create(Class<T> clazz) { public static <T> Creator<T> create(Class<T> 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<T>) ArrayList.class; clazz = (Class<T>) 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<T>) HashMap.class; clazz = (Class<T>) 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<T>) HashSet.class; clazz = (Class<T>) HashSet.class;
} else if (clazz.isAssignableFrom(ConcurrentHashMap.class)) { } else if (Map.class.isAssignableFrom(clazz) && clazz.isAssignableFrom(ConcurrentHashMap.class)) {
clazz = (Class<T>) ConcurrentHashMap.class; clazz = (Class<T>) ConcurrentHashMap.class;
} }
Creator creator = CreatorInner.creatorCacheMap.get(clazz); Creator creator = CreatorInner.creatorCacheMap.get(clazz);