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