retrofit/src/main/java/retrofit2/Utils.java
static Type getGenericSupertype(Type context, Class<?> rawType, Class<?> toResolve) {
    if (toResolve == rawType) return context;

    // We skip searching through interfaces if unknown is an interface.
    if (toResolve.isInterface()) {
      Class<?>[] interfaces = rawType.getInterfaces();
      for (int i = 0, length = interfaces.length; i < length; i++) {
        if (interfaces[i] == toResolve) {
          return rawType.getGenericInterfaces()[i];
        } else if (toResolve.isAssignableFrom(interfaces[i])) {
          return getGenericSupertype(rawType.getGenericInterfaces()[i], interfaces[i], toResolve);
        }
      }
    }

    // Check our supertypes.
    if (!rawType.isInterface()) {
      while (rawType != Object.class) {
        Class<?> rawSupertype = rawType.getSuperclass();
        if (rawSupertype == toResolve) {
          return rawType.getGenericSuperclass();
        } else if (toResolve.isAssignableFrom(rawSupertype)) {
          return getGenericSupertype(rawType.getGenericSuperclass(), rawSupertype, toResolve);
        }
        rawType = rawSupertype;
      }
    }

    // We can't resolve this further.
    return toResolve;
  }
static Type getGenericSupertype(Type context, Class<?> rawType, Class<?> toResolve) {
    if (toResolve == rawType) return context;

    // We skip searching through interfaces if unknown is an interface.
    if (toResolve.isInterface()) {
      Class<?>[] interfaces = rawType.getInterfaces();
      for (int i = 0, length = interfaces.length; i < length; i++) {
        if (interfaces[i] == toResolve) {
          return rawType.getGenericInterfaces()[i];
        } else if (toResolve.isAssignableFrom(interfaces[i])) {
          return getGenericSupertype(rawType.getGenericInterfaces()[i], interfaces[i], toResolve);
        }
      }
    }

    // Check our supertypes.
    if (!rawType.isInterface()) {
      while (rawType != Object.class) {
        Class<?> rawSupertype = rawType.getSuperclass();
        if (rawSupertype == toResolve) {
          return rawType.getGenericSuperclass();
        } else if (toResolve.isAssignableFrom(rawSupertype)) {
          return getGenericSupertype(rawType.getGenericSuperclass(), rawSupertype, toResolve);
        }
        rawType = rawSupertype;
      }
    }

    // We can't resolve this further.
    return toResolve;
  }
static Type getGenericSupertype ( Type context , Class < ? > rawType , Class < ? > toResolve ) { if ( toResolve == rawType ) return context ; // We skip searching through interfaces if unknown is an interface. if ( toResolve . isInterface ( ) ) { Class < ? > [ ] interfaces = rawType . getInterfaces ( ) ; for ( int i = 0 , length = interfaces . length ; i < length ; i ++ ) { if ( interfaces [ i ] == toResolve ) { return rawType . getGenericInterfaces ( ) [ i ] ; } else if ( toResolve . isAssignableFrom ( interfaces [ i ] ) ) { return getGenericSupertype ( rawType . getGenericInterfaces ( ) [ i ] , interfaces [ i ] , toResolve ) ; } } } // Check our supertypes. if ( ! rawType . isInterface ( ) ) { while ( rawType != Object . class ) { Class < ? > rawSupertype = rawType . getSuperclass ( ) ; if ( rawSupertype == toResolve ) { return rawType . getGenericSuperclass ( ) ; } else if ( toResolve . isAssignableFrom ( rawSupertype ) ) { return getGenericSupertype ( rawType . getGenericSuperclass ( ) , rawSupertype , toResolve ) ; } rawType = rawSupertype ; } } // We can't resolve this further. return toResolve ; }
Returns the generic supertype for {@code supertype}. For example, given a class {@code
IntegerSet}, the result for when supertype is {@code Set.class} is {@code Set<Integer>} and the
result when the supertype is {@code Collection.class} is {@code Collection<Integer>}.
Returns the generic supertype for {