private Collection createCollection()

in dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/argument/GeneralTypeConverter.java [794:856]


    private Collection createCollection(Class targetClass, int size) {
        if (targetClass.isInterface()) {
            if (targetClass == List.class || targetClass == Collection.class) {
                return new ArrayList<>(size);
            }
            if (targetClass == Set.class) {
                return CollectionUtils.newHashSet(size);
            }
            if (targetClass == SortedSet.class) {
                return CollectionUtils.newLinkedHashSet(size);
            }
            if (targetClass == Queue.class || targetClass == Deque.class) {
                return new LinkedList<>();
            }
        } else if (Collection.class.isAssignableFrom(targetClass)) {
            if (targetClass == ArrayList.class) {
                return new ArrayList<>(size);
            }
            if (targetClass == LinkedList.class) {
                return new LinkedList();
            }
            if (targetClass == HashSet.class) {
                return CollectionUtils.newHashSet(size);
            }
            if (targetClass == LinkedHashSet.class) {
                return CollectionUtils.newLinkedHashSet(size);
            }
            if (!Modifier.isAbstract(targetClass.getModifiers())) {
                try {
                    Constructor defCt = null;
                    for (Constructor ct : targetClass.getConstructors()) {
                        switch (ct.getParameterCount()) {
                            case 0:
                                defCt = ct;
                                break;
                            case 1:
                                Class paramType = ct.getParameterTypes()[0];
                                if (paramType == int.class) {
                                    return (Collection) ct.newInstance(size);
                                }
                                break;
                            default:
                        }
                    }
                    if (defCt != null) {
                        return (Collection) defCt.newInstance();
                    }
                } catch (Exception ignored) {
                }
            }
        }
        Collection collection = customCreateCollection(targetClass, size);
        if (collection != null) {
            return collection;
        }
        if (targetClass.isAssignableFrom(ArrayList.class)) {
            return new ArrayList<>(size);
        }
        if (targetClass.isAssignableFrom(LinkedHashSet.class)) {
            return CollectionUtils.newLinkedHashSet(size);
        }
        throw new IllegalArgumentException("Unsupported collection type: " + targetClass.getName());
    }