diff --git a/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/src/main/java/org/springframework/data/util/TypeDiscoverer.java index 90629717a..bd48634af 100644 --- a/src/main/java/org/springframework/data/util/TypeDiscoverer.java +++ b/src/main/java/org/springframework/data/util/TypeDiscoverer.java @@ -60,7 +60,7 @@ class TypeDiscoverer implements TypeInformation { private final Map, List>> constructorParameters = new ConcurrentHashMap<>(); private final Lazy>> typeArguments; - private final Lazy> resolvedGenerics; + private final Lazy>> resolvedGenerics; protected TypeDiscoverer(ResolvableType type) { @@ -71,7 +71,9 @@ class TypeDiscoverer implements TypeInformation { this.valueType = Lazy.of(this::doGetMapValueType); this.typeArguments = Lazy.of(this::doGetTypeArguments); this.resolvedGenerics = Lazy.of(() -> Arrays.stream(resolvableType.getGenerics()) // - .map(ResolvableType::toClass).collect(Collectors.toList())); + .map(TypeInformation::of) // use TypeInformation comparison to remove any attachments to variableResolver + // holding the type source + .collect(Collectors.toList())); } static TypeDiscoverer td(ResolvableType type) { diff --git a/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java b/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java index e0b95eb2c..8d08c9e0e 100755 --- a/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java +++ b/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java @@ -29,6 +29,7 @@ import java.util.Set; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; + import org.springframework.beans.factory.annotation.Autowire; import org.springframework.core.ResolvableType; import org.springframework.data.geo.GeoResults; @@ -348,6 +349,15 @@ public class TypeDiscovererUnitTests { assertThat(discoverer.hashCode()).isNotEqualTo(classTypeInformation.hashCode()); } + @Test // GH-3051 + void considersNestedGenericsInEquality() throws ReflectiveOperationException { + + ResolvableType containerList = ResolvableType.forField(WithContainer.class.getDeclaredField("containerList")); + ResolvableType containerMap = ResolvableType.forField(WithContainer.class.getDeclaredField("containerMap")); + + assertThat(TypeInformation.of(containerList)).isNotEqualTo(TypeInformation.of(containerMap)); + } + class Person { Addresses addresses; @@ -441,4 +451,15 @@ public class TypeDiscovererUnitTests { class GeoResultsWrapper { GeoResults results; } + + static class WithContainer { + MyContainer> containerList; + + MyContainer>> containerMap; + } + + static class MyContainer { + T data; + } + }