|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2022 the original author or authors. |
|
|
|
|
* Copyright 2002-2023 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -68,6 +68,7 @@ public final class CollectionFactory {
@@ -68,6 +68,7 @@ public final class CollectionFactory {
|
|
|
|
|
approximableCollectionTypes.add(SortedSet.class); |
|
|
|
|
approximableCollectionTypes.add(NavigableSet.class); |
|
|
|
|
approximableMapTypes.add(Map.class); |
|
|
|
|
approximableMapTypes.add(MultiValueMap.class); |
|
|
|
|
approximableMapTypes.add(SortedMap.class); |
|
|
|
|
approximableMapTypes.add(NavigableMap.class); |
|
|
|
|
|
|
|
|
|
@ -80,6 +81,7 @@ public final class CollectionFactory {
@@ -80,6 +81,7 @@ public final class CollectionFactory {
|
|
|
|
|
approximableCollectionTypes.add(EnumSet.class); |
|
|
|
|
approximableMapTypes.add(HashMap.class); |
|
|
|
|
approximableMapTypes.add(LinkedHashMap.class); |
|
|
|
|
approximableMapTypes.add(LinkedMultiValueMap.class); |
|
|
|
|
approximableMapTypes.add(TreeMap.class); |
|
|
|
|
approximableMapTypes.add(EnumMap.class); |
|
|
|
|
} |
|
|
|
|
@ -121,13 +123,7 @@ public final class CollectionFactory {
@@ -121,13 +123,7 @@ public final class CollectionFactory {
|
|
|
|
|
*/ |
|
|
|
|
@SuppressWarnings({"rawtypes", "unchecked", "cast"}) |
|
|
|
|
public static <E> Collection<E> createApproximateCollection(@Nullable Object collection, int capacity) { |
|
|
|
|
if (collection instanceof LinkedList) { |
|
|
|
|
return new LinkedList<>(); |
|
|
|
|
} |
|
|
|
|
else if (collection instanceof List) { |
|
|
|
|
return new ArrayList<>(capacity); |
|
|
|
|
} |
|
|
|
|
else if (collection instanceof EnumSet) { |
|
|
|
|
if (collection instanceof EnumSet) { |
|
|
|
|
// Cast is necessary for compilation in Eclipse 4.4.1.
|
|
|
|
|
Collection<E> enumSet = (Collection<E>) EnumSet.copyOf((EnumSet) collection); |
|
|
|
|
enumSet.clear(); |
|
|
|
|
@ -136,6 +132,12 @@ public final class CollectionFactory {
@@ -136,6 +132,12 @@ public final class CollectionFactory {
|
|
|
|
|
else if (collection instanceof SortedSet) { |
|
|
|
|
return new TreeSet<>(((SortedSet<E>) collection).comparator()); |
|
|
|
|
} |
|
|
|
|
if (collection instanceof LinkedList) { |
|
|
|
|
return new LinkedList<>(); |
|
|
|
|
} |
|
|
|
|
else if (collection instanceof List) { |
|
|
|
|
return new ArrayList<>(capacity); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
return new LinkedHashSet<>(capacity); |
|
|
|
|
} |
|
|
|
|
@ -191,8 +193,8 @@ public final class CollectionFactory {
@@ -191,8 +193,8 @@ public final class CollectionFactory {
|
|
|
|
|
else if (LinkedList.class == collectionType) { |
|
|
|
|
return new LinkedList<>(); |
|
|
|
|
} |
|
|
|
|
else if (TreeSet.class == collectionType || NavigableSet.class == collectionType |
|
|
|
|
|| SortedSet.class == collectionType) { |
|
|
|
|
else if (TreeSet.class == collectionType || NavigableSet.class == collectionType || |
|
|
|
|
SortedSet.class == collectionType) { |
|
|
|
|
return new TreeSet<>(); |
|
|
|
|
} |
|
|
|
|
else if (EnumSet.class.isAssignableFrom(collectionType)) { |
|
|
|
|
@ -251,6 +253,9 @@ public final class CollectionFactory {
@@ -251,6 +253,9 @@ public final class CollectionFactory {
|
|
|
|
|
else if (map instanceof SortedMap) { |
|
|
|
|
return new TreeMap<>(((SortedMap<K, V>) map).comparator()); |
|
|
|
|
} |
|
|
|
|
else if (map instanceof MultiValueMap) { |
|
|
|
|
return new LinkedMultiValueMap(capacity); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
return new LinkedHashMap<>(capacity); |
|
|
|
|
} |
|
|
|
|
@ -297,26 +302,21 @@ public final class CollectionFactory {
@@ -297,26 +302,21 @@ public final class CollectionFactory {
|
|
|
|
|
@SuppressWarnings({"rawtypes", "unchecked"}) |
|
|
|
|
public static <K, V> Map<K, V> createMap(Class<?> mapType, @Nullable Class<?> keyType, int capacity) { |
|
|
|
|
Assert.notNull(mapType, "Map type must not be null"); |
|
|
|
|
if (mapType.isInterface()) { |
|
|
|
|
if (Map.class == mapType) { |
|
|
|
|
return new LinkedHashMap<>(capacity); |
|
|
|
|
} |
|
|
|
|
else if (SortedMap.class == mapType || NavigableMap.class == mapType) { |
|
|
|
|
return new TreeMap<>(); |
|
|
|
|
} |
|
|
|
|
else if (MultiValueMap.class == mapType) { |
|
|
|
|
return new LinkedMultiValueMap(); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
throw new IllegalArgumentException("Unsupported Map interface: " + mapType.getName()); |
|
|
|
|
} |
|
|
|
|
if (LinkedHashMap.class == mapType || HashMap.class == mapType || Map.class == mapType) { |
|
|
|
|
return new LinkedHashMap<>(capacity); |
|
|
|
|
} |
|
|
|
|
else if (LinkedMultiValueMap.class == mapType || MultiValueMap.class == mapType) { |
|
|
|
|
return new LinkedMultiValueMap(); |
|
|
|
|
} |
|
|
|
|
else if (TreeMap.class == mapType || SortedMap.class == mapType || NavigableMap.class == mapType) { |
|
|
|
|
return new TreeMap<>(); |
|
|
|
|
} |
|
|
|
|
else if (EnumMap.class == mapType) { |
|
|
|
|
Assert.notNull(keyType, "Cannot create EnumMap for unknown key type"); |
|
|
|
|
return new EnumMap(asEnumType(keyType)); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
if (!Map.class.isAssignableFrom(mapType)) { |
|
|
|
|
if (mapType.isInterface() || !Map.class.isAssignableFrom(mapType)) { |
|
|
|
|
throw new IllegalArgumentException("Unsupported Map type: " + mapType.getName()); |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
|