diff --git a/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java b/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java index 55e0ba812..7eb2db7fb 100644 --- a/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java +++ b/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java @@ -184,6 +184,16 @@ class ParameterizedTypeInformation extends ParentTypeAwareTypeInformation return createInfo(type.getActualTypeArguments()[0]); } + /* + * (non-Javadoc) + * @see org.springframework.data.util.TypeDiscoverer#specialize(org.springframework.data.util.ClassTypeInformation) + */ + @Override + @SuppressWarnings("unchecked") + public TypeInformation specialize(ClassTypeInformation type) { + return isResolvedCompletely() ? (TypeInformation) type : super.specialize(type); + } + /* * (non-Javadoc) * @see org.springframework.data.util.ParentTypeAwareTypeInformation#equals(java.lang.Object) diff --git a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java index 1ad870e38..c7e5bf3de 100755 --- a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java +++ b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java @@ -16,7 +16,7 @@ package org.springframework.data.util; import static org.assertj.core.api.Assertions.*; -import static org.springframework.data.util.ClassTypeInformation.*; +import static org.springframework.data.util.ClassTypeInformation.from; import javaslang.collection.Traversable; @@ -399,6 +399,17 @@ public class ClassTypeInformationUnitTests { assertThat(information.getMapValueType().getType()).isAssignableFrom(Integer.class); } + @Test // DATACMNS-1138 + public void usesTargetTypeForWildcardedBaseOnSpecialization() { + + ClassTypeInformation wrapper = ClassTypeInformation.from(WildcardedWrapper.class); + ClassTypeInformation concrete = ClassTypeInformation.from(SomeConcrete.class); + + TypeInformation property = wrapper.getRequiredProperty("wildcarded"); + + assertThat(property.specialize(concrete)).isEqualTo(concrete); + } + static class StringMapContainer extends MapContainer { } @@ -601,4 +612,16 @@ public class ClassTypeInformationUnitTests { static interface SampleTraversable extends Traversable {} static interface SampleMap extends javaslang.collection.Map {} + + // DATACMNS-1138 + + static class SomeGeneric { + T value; + } + + static class SomeConcrete extends SomeGeneric {} + + static class WildcardedWrapper { + SomeGeneric wildcarded; + } }