public void visitTypeApply(JCTypeApply tree) {
            if (tree.type.tag == CLASS) {
                List<Type> formals = tree.type.tsym.type.getTypeArguments();
                List<Type> actuals = tree.type.getTypeArguments();
                List<JCExpression> args = tree.arguments;
                List<Type> forms = formals;
                ListBuffer<TypeVar> tvars_buf = new ListBuffer<TypeVar>();

                // For matching pairs of actual argument types `a' and
                // formal type parameters with declared bound `b' ...
                while (args.nonEmpty() && forms.nonEmpty()) {
                    validate(args.head);

                    // exact type arguments needs to know their
                    // bounds (for upper and lower bound
                    // calculations).  So we create new TypeVars with
                    // bounds substed with actuals.
                    tvars_buf.append(types.substBound(((TypeVar)forms.head),
                                                      formals,
                                                      Type.removeBounds(actuals)));

                    args = args.tail;
                    forms = forms.tail;
                }

                args = tree.arguments;
                List<TypeVar> tvars = tvars_buf.toList();
                while (args.nonEmpty() && tvars.nonEmpty()) {
                    // Let the actual arguments know their bound
                    args.head.type.withTypeVar(tvars.head);
                    args = args.tail;
                    tvars = tvars.tail;
                }

                args = tree.arguments;
                tvars = tvars_buf.toList();
                while (args.nonEmpty() && tvars.nonEmpty()) {
                    checkExtends(args.head.pos(),
                                 args.head.type,
                                 tvars.head);
                    args = args.tail;
                    tvars = tvars.tail;
                }

                // Check that this type is either fully parameterized, or
                // not parameterized at all.
                if (tree.type.getEnclosingType().isRaw())
                    log.error(tree.pos(), "improperly.formed.type.inner.raw.param");
                if (tree.clazz.getTag() == JCTree.SELECT)
                    visitSelectInternal((JCFieldAccess)tree.clazz);
            }
        }