Improve resolution of generic type variables
See gh-23418
This commit is contained in:
committed by
Stephane Nicoll
parent
267908a118
commit
124a76b1ad
@@ -199,8 +199,13 @@ public final class GenericTypeResolver {
|
|||||||
private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, ResolvableType contextType) {
|
private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, ResolvableType contextType) {
|
||||||
ResolvableType resolvedType;
|
ResolvableType resolvedType;
|
||||||
if (contextType.hasGenerics()) {
|
if (contextType.hasGenerics()) {
|
||||||
resolvedType = ResolvableType.forType(typeVariable, contextType);
|
ResolvableType.VariableResolver variableResolver = contextType.asVariableResolver();
|
||||||
if (resolvedType.resolve() != null) {
|
if (variableResolver == null) {
|
||||||
|
return ResolvableType.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolvedType = variableResolver.resolveVariable(typeVariable);
|
||||||
|
if (resolvedType != null) {
|
||||||
return resolvedType;
|
return resolvedType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -208,16 +213,17 @@ public final class GenericTypeResolver {
|
|||||||
ResolvableType superType = contextType.getSuperType();
|
ResolvableType superType = contextType.getSuperType();
|
||||||
if (superType != ResolvableType.NONE) {
|
if (superType != ResolvableType.NONE) {
|
||||||
resolvedType = resolveVariable(typeVariable, superType);
|
resolvedType = resolveVariable(typeVariable, superType);
|
||||||
if (resolvedType.resolve() != null) {
|
if (resolvedType != ResolvableType.NONE) {
|
||||||
return resolvedType;
|
return resolvedType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ResolvableType ifc : contextType.getInterfaces()) {
|
for (ResolvableType ifc : contextType.getInterfaces()) {
|
||||||
resolvedType = resolveVariable(typeVariable, ifc);
|
resolvedType = resolveVariable(typeVariable, ifc);
|
||||||
if (resolvedType.resolve() != null) {
|
if (resolvedType != ResolvableType.NONE) {
|
||||||
return resolvedType;
|
return resolvedType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ResolvableType.NONE;
|
return ResolvableType.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -173,6 +173,19 @@ class GenericTypeResolverTests {
|
|||||||
assertThat(resolved[1]).isEqualTo(Long.class);
|
assertThat(resolved[1]).isEqualTo(Long.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void resolvePartiallySpecializedTypeVariables() {
|
||||||
|
Type resolved = resolveType(BiGenericClass.class.getTypeParameters()[0], TypeFixedBiGenericClass.class);
|
||||||
|
assertThat(resolved).isNotNull();
|
||||||
|
assertThat(D.class).isEqualTo(resolved);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void resolveTransitiveTypeVariableWithDifferentName() {
|
||||||
|
Type resolved = resolveType(BiGenericClass.class.getTypeParameters()[1], TypeFixedBiGenericClass.class);
|
||||||
|
assertThat(resolved).isNotNull();
|
||||||
|
assertThat(E.class).isEqualTo(resolved);
|
||||||
|
}
|
||||||
|
|
||||||
public interface MyInterfaceType<T> {
|
public interface MyInterfaceType<T> {
|
||||||
}
|
}
|
||||||
@@ -293,11 +306,23 @@ class GenericTypeResolverTests {
|
|||||||
|
|
||||||
class B<T>{}
|
class B<T>{}
|
||||||
|
|
||||||
|
class C extends A {}
|
||||||
|
|
||||||
|
class D extends B<Long> {}
|
||||||
|
|
||||||
|
class E extends C {}
|
||||||
|
|
||||||
class TestIfc<T>{}
|
class TestIfc<T>{}
|
||||||
|
|
||||||
class TestImpl<I extends A, T extends B<I>> extends TestIfc<T>{
|
class TestImpl<I extends A, T extends B<I>> extends TestIfc<T>{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static abstract class BiGenericClass<T extends B<?>, V extends A> {}
|
||||||
|
|
||||||
|
static abstract class SpecializedBiGenericClass<U extends C> extends BiGenericClass<D, U>{}
|
||||||
|
|
||||||
|
static class TypeFixedBiGenericClass extends SpecializedBiGenericClass<E> {}
|
||||||
|
|
||||||
static class TopLevelClass<T> {
|
static class TopLevelClass<T> {
|
||||||
class Nested<X> {
|
class Nested<X> {
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user