code: private static Type buildParameterType(final Class<?> root,
                                             final Type first,
                                             final Type second,
                                             final boolean alwaysIncludeInterfaces,
                                             final PathsCache cache) {
          Type res = buildImpl(first, second, alwaysIncludeInterfaces, cache);
          if (res instanceof PlaceholderType) {
              res = ((PlaceholderType) res).forRoot(root);
          }
          return res;
      }
docs: Method used instead of direct {@link #buildImpl(Type, Type, boolean, PathsCache)} call while computing
  generics. Method may return customized placeholder type, which will try to resolve not to the same type
  as root type (avoid situation like {@code Comparable<Comparable>}).
  
  @param root                    root type (computing generics for)
  @param first                   first type
  @param second                  second type
  @param alwaysIncludeInterfaces true to resolve not only base class but also all common interfaces, false
  to look common class only and lookup interfaces inly when no base class found
  @return maximum class assignable to both types or {@code Object} if classes are incompatible