code: private static Type getClosestParentType(final Class<?> cls, final Class<?> superClass) {
          // only look at the interfaces if the super class is also an interface
          if (superClass.isInterface()) {
              // get the generic interfaces of the subject class
              final Type[] interfaceTypes = cls.getGenericInterfaces();
              // will hold the best generic interface match found
              Type genericInterface = null;
  
              // find the interface closest to the super class
              for (final Type midType : interfaceTypes) {
                  Class<?> midClass = null;
  
                  if (midType instanceof ParameterizedType) {
                      midClass = getRawType((ParameterizedType) midType);
                  } else if (midType instanceof Class<?>) {
                      midClass = (Class<?>) midType;
                  } else {
                      throw new IllegalStateException("Unexpected generic"
                              + " interface type found: " + midType);
                  }
  
                  // check if this interface is further up the inheritance chain
                  // than the previously found match
                  if (isAssignable(midClass, superClass)
                          && isAssignable(genericInterface, (Type) midClass)) {
                      genericInterface = midType;
                  }
              }
  
              // found a match?
              if (genericInterface != null) {
                  return genericInterface;
              }
          }
  
          // none of the interfaces were descendants of the target class, so the
          // super class has to be one, instead
          return cls.getGenericSuperclass();
      }
docs: <p>Get the closest parent type to the
  super class specified by {@code superClass}.</p>
  
  @param cls        the class in question
  @param superClass the super class
  @return the closes parent type