Browse Source

Consistent support for EnumSet subclasses in CollectionFactory

Issue: SPR-17619
pull/2061/head
Juergen Hoeller 6 years ago
parent
commit
31a24720a6
  1. 4
      spring-core/src/main/java/org/springframework/core/CollectionFactory.java
  2. 17
      spring-core/src/test/java/org/springframework/core/CollectionFactoryTests.java

4
spring-core/src/main/java/org/springframework/core/CollectionFactory.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* 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.
@ -195,7 +195,7 @@ public final class CollectionFactory { @@ -195,7 +195,7 @@ public final 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));

17
spring-core/src/test/java/org/springframework/core/CollectionFactoryTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* 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.
@ -35,11 +35,11 @@ import java.util.TreeMap; @@ -35,11 +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.empty;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import static org.springframework.core.CollectionFactory.*;
@ -104,7 +104,7 @@ public class CollectionFactoryTests { @@ -104,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() {
@ -242,6 +242,12 @@ public class CollectionFactoryTests { @@ -242,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);
@ -297,7 +303,8 @@ public class CollectionFactoryTests { @@ -297,7 +303,8 @@ public class CollectionFactoryTests {
}
static enum Color {
enum Color {
RED, BLUE;
}
}

Loading…
Cancel
Save