in dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/argument/GeneralTypeConverter.java [933:990]
private Map createMap(Class targetClass, int size) {
if (targetClass.isInterface()) {
if (targetClass == Map.class) {
return CollectionUtils.newHashMap(size);
}
if (targetClass == ConcurrentMap.class) {
return CollectionUtils.newConcurrentHashMap(size);
}
if (SortedMap.class.isAssignableFrom(targetClass)) {
return new TreeMap<>();
}
} else if (Map.class.isAssignableFrom(targetClass)) {
if (targetClass == HashMap.class) {
return CollectionUtils.newHashMap(size);
}
if (targetClass == LinkedHashMap.class) {
return CollectionUtils.newLinkedHashMap(size);
}
if (targetClass == TreeMap.class) {
return new TreeMap<>();
}
if (targetClass == ConcurrentHashMap.class) {
return CollectionUtils.newConcurrentHashMap(size);
}
if (!Modifier.isAbstract(targetClass.getModifiers())) {
try {
Constructor defCt = null;
for (Constructor ct : targetClass.getConstructors()) {
if (Modifier.isPublic(ct.getModifiers())) {
switch (ct.getParameterCount()) {
case 0:
defCt = ct;
break;
case 1:
if (ct.getParameterTypes()[0] == int.class) {
return (Map) ct.newInstance(CollectionUtils.capacity(size));
}
break;
default:
}
}
}
if (defCt != null) {
return (Map) defCt.newInstance();
}
} catch (Throwable ignored) {
}
}
}
Map map = customCreateMap(targetClass, size);
if (map != null) {
return map;
}
if (targetClass.isAssignableFrom(LinkedHashMap.class)) {
return CollectionUtils.newLinkedHashMap(size);
}
throw new IllegalArgumentException("Unsupported map type: " + targetClass.getName());
}