code: public Type asSuper(Type t, Symbol sym) {
          /* Some examples:
           *
           * (Enum<E>, Comparable) => Comparable<E>
           * (c.s.s.d.AttributeTree.ValueKind, Enum) => Enum<c.s.s.d.AttributeTree.ValueKind>
           * (c.s.s.t.ExpressionTree, c.s.s.t.Tree) => c.s.s.t.Tree
           * (j.u.List<capture#160 of ? extends c.s.s.d.DocTree>, Iterable) =>
           *     Iterable<capture#160 of ? extends c.s.s.d.DocTree>
           */
          if (sym.type == syms.objectType) { //optimization
              return syms.objectType;
          }
          return asSuper.visit(t, sym);
      }
docs: Return the (most specific) base type of t that starts with the
  given symbol.  If none exists, return null.
  
  Caveat Emptor: Since javac represents the class of all arrays with a singleton
  symbol Symtab.arrayClass, which by being a singleton cannot hold any discriminant,
  this method could yield surprising answers when invoked on arrays. For example when
  invoked with t being byte [] and sym being t.sym itself, asSuper would answer null.
  
  @param t a type
  @param sym a symbol