Merge pull request #23418 from Syquel

* pr/23418:
  Polish "Improve resolution of generic type variables"
  Improve resolution of generic type variables

Closes gh-23418
This commit is contained in:
Stephane Nicoll
2022-09-26 13:13:24 +02:00
2 changed files with 31 additions and 4 deletions

View File

@@ -199,8 +199,12 @@ public final class GenericTypeResolver {
private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, ResolvableType contextType) {
ResolvableType resolvedType;
if (contextType.hasGenerics()) {
resolvedType = ResolvableType.forType(typeVariable, contextType);
if (resolvedType.resolve() != null) {
ResolvableType.VariableResolver variableResolver = contextType.asVariableResolver();
if (variableResolver == null) {
return ResolvableType.NONE;
}
resolvedType = variableResolver.resolveVariable(typeVariable);
if (resolvedType != null) {
return resolvedType;
}
}
@@ -208,13 +212,13 @@ public final class GenericTypeResolver {
ResolvableType superType = contextType.getSuperType();
if (superType != ResolvableType.NONE) {
resolvedType = resolveVariable(typeVariable, superType);
if (resolvedType.resolve() != null) {
if (resolvedType != ResolvableType.NONE) {
return resolvedType;
}
}
for (ResolvableType ifc : contextType.getInterfaces()) {
resolvedType = resolveVariable(typeVariable, ifc);
if (resolvedType.resolve() != null) {
if (resolvedType != ResolvableType.NONE) {
return resolvedType;
}
}

View File

@@ -173,6 +173,17 @@ class GenericTypeResolverTests {
assertThat(resolved[1]).isEqualTo(Long.class);
}
@Test
public void resolvePartiallySpecializedTypeVariables() {
Type resolved = resolveType(BiGenericClass.class.getTypeParameters()[0], TypeFixedBiGenericClass.class);
assertThat(resolved).isEqualTo(D.class);
}
@Test
public void resolveTransitiveTypeVariableWithDifferentName() {
Type resolved = resolveType(BiGenericClass.class.getTypeParameters()[1], TypeFixedBiGenericClass.class);
assertThat(resolved).isEqualTo(E.class);
}
public interface MyInterfaceType<T> {
}
@@ -293,11 +304,23 @@ class GenericTypeResolverTests {
class B<T>{}
class C extends A {}
class D extends B<Long> {}
class E extends C {}
class 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> {
class Nested<X> {
}