private static ResolvableType findGenericType(ResolvableType source, Class<?> type) {

      Class<?> rawType = getRawType(source);

      if (Object.class.equals(rawType)) {
        return null;
      }

      if (rawType.equals(type)) {
        return source;
      }

      return findGenericType(source.getSuperType(), type);
    }
 private ResolvableType resolveVariable(TypeVariable<?> typeVariable, ResolvableType contextType) {
   ResolvableType resolvedType;
   if (contextType.hasGenerics()) {
     resolvedType = ResolvableType.forType(typeVariable, contextType);
     if (resolvedType.resolve() != null) {
       return resolvedType;
     }
   }
   resolvedType = resolveVariable(typeVariable, contextType.getSuperType());
   if (resolvedType.resolve() != null) {
     return resolvedType;
   }
   for (ResolvableType ifc : contextType.getInterfaces()) {
     resolvedType = resolveVariable(typeVariable, ifc);
     if (resolvedType.resolve() != null) {
       return resolvedType;
     }
   }
   return ResolvableType.NONE;
 }