private Map createMap()

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());
    }