diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 2a3a7ec1e..1ac34b6bb 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -10,10 +10,10 @@ import cn.hutool.core.comparator.PropertyComparator; import cn.hutool.core.convert.CompositeConverter; import cn.hutool.core.convert.Convert; import cn.hutool.core.exceptions.UtilException; +import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.func.SerBiConsumer; import cn.hutool.core.lang.func.SerConsumer3; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.reflect.ClassUtil; import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.FieldUtil; import cn.hutool.core.reflect.TypeUtil; @@ -32,7 +32,6 @@ 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; @@ -714,15 +713,28 @@ public class CollUtil { } /** - * 创建新的集合对象 + * 创建新的集合对象,返回具体的泛型集合 * - * @param 集合类型 + * @param 集合元素类型,rawtype 如 ArrayList.class, EnumSet.class ... * @param collectionType 集合类型 * @return 集合类型对应的实例 * @since 3.0.8 */ - @SuppressWarnings({"unchecked", "rawtypes"}) public static Collection create(final Class collectionType) { + return create(collectionType, null); + } + + /** + * 创建新的集合对象,返回具体的泛型集合 + * + * @param 集合元素类型,rawtype 如 ArrayList.class, EnumSet.class ... + * @param collectionType 集合类型 + * @param elementType 集合元素类,只用于EnumSet创建,如果创建EnumSet,则此参数必须非空 + * @return 集合类型对应的实例 + * @since 3.0.8 + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + public static Collection create(final Class collectionType, final Class elementType) { final Collection list; if (collectionType.isAssignableFrom(AbstractCollection.class)) { // 抽象集合默认使用ArrayList @@ -743,7 +755,7 @@ public class CollUtil { return CompareUtil.compare(o1.toString(), o2.toString()); }); } else if (collectionType.isAssignableFrom(EnumSet.class)) { - list = (Collection) EnumSet.noneOf((Class) ClassUtil.getTypeArgument(collectionType)); + list = (Collection) EnumSet.noneOf((Class) Assert.notNull(elementType)); } // List @@ -1313,6 +1325,7 @@ public class CollUtil { index++; } } + return Convert.convert(int[].class, indexList); } @@ -1386,34 +1399,6 @@ public class CollUtil { return map; } - /** - * 将数组转换为Map(HashMap),支持数组元素类型为: - * - *
-	 * Map.Entry
-	 * 长度大于1的数组(取前两个值),如果不满足跳过此元素
-	 * Iterable 长度也必须大于1(取前两个值),如果不满足跳过此元素
-	 * Iterator 长度也必须大于1(取前两个值),如果不满足跳过此元素
-	 * 
- * - *
-	 * Map<Object, Object> colorMap = CollectionUtil.toMap(new String[][] {{
-	 *     {"RED", "#FF0000"},
-	 *     {"GREEN", "#00FF00"},
-	 *     {"BLUE", "#0000FF"}});
-	 * 
- *

- * 参考:commons-lang - * - * @param array 数组。元素类型为Map.Entry、数组、Iterable、Iterator - * @return {@link HashMap} - * @see MapUtil#of(Object[]) - * @since 3.0.8 - */ - public static HashMap toMap(final Object[] array) { - return MapUtil.of(array); - } - /** * 将集合转换为排序后的TreeSet * @@ -1441,32 +1426,6 @@ public class CollUtil { return new IteratorEnumeration<>(Objects.requireNonNull(iter)); } - /** - * Enumeration转换为Iterator - *

- * Adapt the specified {@code Enumeration} to the {@code Iterator} interface - * - * @param 集合元素类型 - * @param e {@link Enumeration} - * @return {@link Iterator} - * @see IterUtil#asIterator(Enumeration) - */ - public static Iterator asIterator(final Enumeration e) { - return IterUtil.asIterator(e); - } - - /** - * {@link Iterator} 转为 {@link Iterable}, 但是仅可使用一次 - * - * @param 元素类型 - * @param iter {@link Iterator} - * @return {@link Iterable} - * @see IterUtil#asIterable(Iterator) - */ - public static Iterable asIterable(final Iterator iter) { - return IterUtil.asIterable(iter); - } - /** * {@link Iterable}转为{@link Collection}
* 首先尝试强转,强转失败则构建一个新的{@link ArrayList} diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/CollectionConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/CollectionConverter.java index 08cf77aef..0326efbb7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/CollectionConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/CollectionConverter.java @@ -16,6 +16,9 @@ import java.util.Collection; */ public class CollectionConverter implements Converter { + /** + * 单例实体 + */ public static CollectionConverter INSTANCE = new CollectionConverter(); @Override @@ -36,7 +39,8 @@ public class CollectionConverter implements Converter { * @return 转换后的集合对象 */ public Collection convert(final Type collectionType, final Type elementType, final Object value) { - final Collection collection = CollUtil.create(TypeUtil.getClass(collectionType)); + // pr#2684,兼容EnumSet创建 + final Collection collection = CollUtil.create(TypeUtil.getClass(collectionType), TypeUtil.getClass(elementType)); return CollUtil.addAll(collection, value, elementType); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java index 1a2ed204e..7b7fda581 100755 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -3043,6 +3043,21 @@ public class FileUtil extends PathUtil { return null; } + /** + * 获取指定文件的父路径 + * + *
+	 * getParent(file("d:/aaa/bbb/cc/ddd")) -》 "d:/aaa/bbb/cc"
+	 * 
+ * + * @param file 目录或文件 + * @return 路径File,如果不存在返回null + * @since 6.0.0 + */ + public static File getParent(final File file) { + return getParent(file, 1); + } + /** * 获取指定层级的父路径 * diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/Issue2683Test.java b/hutool-core/src/test/java/cn/hutool/core/bean/Issue2683Test.java new file mode 100755 index 000000000..c18ce5426 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/bean/Issue2683Test.java @@ -0,0 +1,42 @@ +package cn.hutool.core.bean; + +import cn.hutool.core.collection.CollUtil; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Collection; +import java.util.EnumSet; + +/** + * EnumSet创建时无法自动获取其元素类型,通过传入方式获取 + */ +public class Issue2683Test { + + enum Version { + dev, + prod + } + + @Data + public static class Vto { + EnumSet versions; + } + + + @Test + public void beanWithEnumSetTest() { + final Vto v1 = new Vto(); + v1.setVersions(EnumSet.allOf(Version.class)); + final Vto v2 = BeanUtil.copyProperties(v1, Vto.class); + Assert.assertNotNull(v2); + Assert.assertNotNull(v2.getVersions()); + } + + @Test + public void enumSetTest() { + final Collection objects = CollUtil.create(EnumSet.class, Version.class); + Assert.assertNotNull(objects); + Assert.assertTrue(EnumSet.class.isAssignableFrom(objects.getClass())); + } +}