code: private Pair<Type, Type> getParameterizedSupers(Type t, Type s) {
          Type lubResult = types.lub(t, s);
          if (lubResult == syms.errType || lubResult == syms.botType ||
                  !lubResult.isParameterized()) {
              return null;
          }
          Type asSuperOfT = types.asSuper(t, lubResult.tsym);
          Type asSuperOfS = types.asSuper(s, lubResult.tsym);
          return new Pair<>(asSuperOfT, asSuperOfS);
      }
docs: /* If for two types t and s there is a least upper bound that is a
  parameterized type G, then there exists a supertype of 't' of the form
  G<T1, ..., Tn> and a supertype of 's' of the form G<S1, ..., Sn>
  which will be returned by this method. If no such supertypes exists then
  null is returned.
  
  As an example for the following input:
  
  t = java.util.ArrayList<java.lang.String>
  s = java.util.List<T>
  
  we get this ouput:
  
  Pair[java.util.List<java.lang.String>,java.util.List<T>]