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