diff --git a/spring-core/src/main/java/org/springframework/core/CollectionFactory.java b/spring-core/src/main/java/org/springframework/core/CollectionFactory.java index 05c6ac8359..7b67ed34cb 100644 --- a/spring-core/src/main/java/org/springframework/core/CollectionFactory.java +++ b/spring-core/src/main/java/org/springframework/core/CollectionFactory.java @@ -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 { 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) EnumSet.noneOf(asEnumType(elementType)); diff --git a/spring-core/src/test/java/org/springframework/core/CollectionFactoryTests.java b/spring-core/src/test/java/org/springframework/core/CollectionFactoryTests.java index bfcbbed29d..aea7a96764 100644 --- a/spring-core/src/test/java/org/springframework/core/CollectionFactoryTests.java +++ b/spring-core/src/test/java/org/springframework/core/CollectionFactoryTests.java @@ -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; 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 { * {@link CollectionFactory#createApproximateMap(Object, int)} * is not type-safe. *

The reasoning is similar that described in - * {@link #createApproximateCollectionIsNotTypeSafe()}. + * {@link #createApproximateCollectionIsNotTypeSafeForEnumSet}. */ @Test public void createApproximateMapIsNotTypeSafeForEnumMap() { @@ -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 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 { } - static enum Color { + enum Color { RED, BLUE; } + }