This commit is contained in:
hongdan.qin 2022-10-26 11:21:23 +08:00
parent 2bafc6c8a8
commit 58f90d6e06
3 changed files with 65 additions and 49 deletions

View File

@ -13,41 +13,12 @@ import cn.hutool.core.lang.Matcher;
import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.Func1;
import cn.hutool.core.lang.hash.Hash32; import cn.hutool.core.lang.hash.Hash32;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.*;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.TypeUtil;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.AbstractCollection; import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Deque;
import java.util.EnumSet;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.NavigableSet;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.SortedSet;
import java.util.Stack;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
@ -1003,15 +974,15 @@ public class CollUtil {
} }
/** /**
* 创建新的集合对象 * 创建新的集合对象返回具体的泛型集合
* *
* @param <T> 集合类型 * @param <T> 集合元素类型
* @param collectionType 集合类型 * @param collectionType 集合类型rawtype ArrayList.class, EnumSet.class ...
* @return 集合类型对应的实例 * @return 集合类型对应的实例
* @since 3.0.8 * @since v5
*/ */
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
public static <T> Collection<T> create(Class<?> collectionType) { private static <T> Collection<T> doCreate(Class<?> collectionType, Class<T> elementType) {
Collection<T> list; Collection<T> list;
if (collectionType.isAssignableFrom(AbstractCollection.class)) { if (collectionType.isAssignableFrom(AbstractCollection.class)) {
// 抽象集合默认使用ArrayList // 抽象集合默认使用ArrayList
@ -1032,7 +1003,7 @@ public class CollUtil {
return CompareUtil.compare(o1.toString(), o2.toString()); return CompareUtil.compare(o1.toString(), o2.toString());
}); });
} else if (collectionType.isAssignableFrom(EnumSet.class)) { } else if (collectionType.isAssignableFrom(EnumSet.class)) {
list = (Collection<T>) EnumSet.noneOf((Class<Enum>) ClassUtil.getTypeArgument(collectionType)); list = (Collection<T>) EnumSet.noneOf((Class<Enum>) elementType);
} }
// List // List
@ -1058,6 +1029,32 @@ public class CollUtil {
return list; return list;
} }
/**
* 创建新的集合对象返回具体的泛型集合
*
* @param <T> 集合元素类型
* @param collectionType 集合类型rawtype ArrayList.class, EnumSet.class ...
* @return 集合类型对应的实例
* @since v5
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> Collection<T> create(Class<?> collectionType, Class<T> elementType) {
return doCreate(collectionType, elementType);
}
/**
* 创建新的集合对象
*
* @param <T> 集合类型
* @param collectionType 集合类型
* @return 集合类型对应的实例
* @since 3.0.8
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> Collection<T> create(Class<?> collectionType) {
return doCreate(collectionType, null);
}
/** /**
* 去重集合 * 去重集合
* *
@ -2098,6 +2095,7 @@ public class CollUtil {
* ["456"], "123" -&gt; true * ["456"], "123" -&gt; true
* [Animal{"name": "jack"}], Dog{"name": "jack"} -&gt; true * [Animal{"name": "jack"}], Dog{"name": "jack"} -&gt; true
* </pre> * </pre>
*
* @param collection 被加入的集合 * @param collection 被加入的集合
* @param object 要添加到集合的对象 * @param object 要添加到集合的对象
* @param <T> 集合元素类型 * @param <T> 集合元素类型

View File

@ -72,7 +72,7 @@ public class CollectionConverter implements Converter<Collection<?>> {
* @return 转换后的集合对象 * @return 转换后的集合对象
*/ */
protected Collection<?> convertInternal(Object value) { protected Collection<?> convertInternal(Object value) {
final Collection<Object> collection = CollUtil.create(TypeUtil.getClass(this.collectionType)); final Collection<?> collection = CollUtil.create(TypeUtil.getClass(this.collectionType), TypeUtil.getClass(this.elementType));
return CollUtil.addAll(collection, value, this.elementType); return CollUtil.addAll(collection, value, this.elementType);
} }
} }

View File

@ -22,14 +22,7 @@ import java.io.Serializable;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Arrays; import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -647,6 +640,31 @@ public class BeanUtilTest {
Assert.assertEquals(new Long(123456L), station2.getId()); Assert.assertEquals(new Long(123456L), station2.getId());
} }
enum Version {
dev,
prod
}
@Data
public static class Vto {
EnumSet<Version> versions;
}
@Test
public void beanWithEnumSetTest() {
Vto v1 = new Vto();
v1.setVersions(EnumSet.allOf(Version.class));
System.out.println(BeanUtil.copyProperties(v1, Vto.class));
}
@Test
public void enumSetTest() {
final Collection<Version> objects = CollUtil.create(EnumSet.class, Version.class);
System.out.println(objects.getClass());
System.out.println(objects);
}
static class Station extends Tree<Long> {} static class Station extends Tree<Long> {}
static class Tree<T> extends Entity<T> {} static class Tree<T> extends Entity<T> {}