提交 21baa728 编写于 作者: J Juergen Hoeller

Consistent support for EnumSet subclasses in CollectionFactory

Issue: SPR-17619

(cherry picked from commit 31a24720)
上级 3c7887c2
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 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.
......@@ -189,7 +189,7 @@ public abstract class CollectionFactory {
throw new IllegalArgumentException("Unsupported Collection interface: " + collectionType.getName());
}
}
else if (EnumSet.class == collectionType) {
else if (EnumSet.class.isAssignableFrom(collectionType)) {
Assert.notNull(elementType, "Cannot create EnumSet for unknown element type");
// Cast is necessary for compilation in Eclipse 4.4.1.
return (Collection<E>) EnumSet.noneOf(asEnumType(elementType));
......
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2018 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.
......@@ -35,10 +35,11 @@ import java.util.TreeMap;
import java.util.TreeSet;
import org.junit.Test;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import static org.springframework.core.CollectionFactory.*;
......@@ -103,7 +104,7 @@ public class CollectionFactoryTests {
* {@link CollectionFactory#createApproximateMap(Object, int)}
* is not type-safe.
* <p>The reasoning is similar that described in
* {@link #createApproximateCollectionIsNotTypeSafe()}.
* {@link #createApproximateCollectionIsNotTypeSafeForEnumSet}.
*/
@Test
public void createApproximateMapIsNotTypeSafeForEnumMap() {
......@@ -165,27 +166,27 @@ public class CollectionFactoryTests {
@Test
public void createApproximateCollectionFromEmptyHashSet() {
Collection<String> set = createApproximateCollection(new HashSet<String>(), 2);
assertThat(set.size(), is(0));
assertThat(set, is(empty()));
}
@Test
public void createApproximateCollectionFromNonEmptyHashSet() {
HashSet<String> hashSet = new HashSet<String>();
HashSet<String> hashSet = new HashSet<>();
hashSet.add("foo");
Collection<String> set = createApproximateCollection(hashSet, 2);
assertThat(set.size(), is(0));
assertThat(set, is(empty()));
}
@Test
public void createApproximateCollectionFromEmptyEnumSet() {
Collection<Color> colors = createApproximateCollection(EnumSet.noneOf(Color.class), 2);
assertThat(colors.size(), is(0));
assertThat(colors, is(empty()));
}
@Test
public void createApproximateCollectionFromNonEmptyEnumSet() {
Collection<Color> colors = createApproximateCollection(EnumSet.of(Color.BLUE), 2);
assertThat(colors.size(), is(0));
assertThat(colors, is(empty()));
}
@Test
......@@ -196,7 +197,7 @@ public class CollectionFactoryTests {
@Test
public void createApproximateMapFromNonEmptyHashMap() {
Map<String, String> hashMap = new HashMap<String, String>();
Map<String, String> hashMap = new HashMap<>();
hashMap.put("foo", "bar");
Map<String, String> map = createApproximateMap(hashMap, 2);
assertThat(map.size(), is(0));
......@@ -210,7 +211,7 @@ public class CollectionFactoryTests {
@Test
public void createApproximateMapFromNonEmptyEnumMap() {
EnumMap<Color, String> enumMap = new EnumMap<Color, String>(Color.class);
EnumMap<Color, String> enumMap = new EnumMap<>(Color.class);
enumMap.put(Color.BLUE, "blue");
Map<Color, String> colors = createApproximateMap(enumMap, 2);
assertThat(colors.size(), is(0));
......@@ -241,6 +242,12 @@ public class CollectionFactoryTests {
assertThat(createCollection(EnumSet.class, Color.class, 0), is(instanceOf(EnumSet.class)));
}
@Test // SPR-17619
public void createsEnumSetSubclass() {
EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);
assertThat(createCollection(enumSet.getClass(), Color.class, 0), is(instanceOf(enumSet.getClass())));
}
@Test(expected = IllegalArgumentException.class)
public void rejectsInvalidElementTypeForEnumSet() {
createCollection(EnumSet.class, Object.class, 0);
......@@ -296,7 +303,8 @@ public class CollectionFactoryTests {
}
static enum Color {
enum Color {
RED, BLUE;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册