code: protected boolean boundsMatch(Type[] upperBounds, Type[] stricterUpperBounds) {
          // getUppermostBounds to make sure that both arrays of bounds contain ONLY ACTUAL TYPES! otherwise, the CovariantTypes
          // assignability rules do not reflect our needs
          upperBounds = getUppermostBounds(upperBounds);
          stricterUpperBounds = getUppermostBounds(stricterUpperBounds);
          for (Type upperBound : upperBounds) {
              if (!CovariantTypes.isAssignableFromAtLeastOne(upperBound, stricterUpperBounds)) {
                  return false;
              }
          }
          return true;
      }
docs: Returns <tt>true</tt> iff for each upper bound T, there is at least one bound from <tt>stricterUpperBounds</tt>
  assignable to T. This reflects that <tt>stricterUpperBounds</tt> are at least as strict as <tt>upperBounds</tt> are.
  <p>
  Arguments passed to this method must be legal java bounds, i.e. bounds returned by {@link TypeVariable#getBounds()},
  {@link WildcardType#getUpperBounds()} or {@link WildcardType#getLowerBounds()}.