private JCExpression getTypedParameter(
     Parameter param, int argIndex, boolean varargs, java.util.List<ProducedType> parameterTypes) {
   JCExpression argExpr;
   if (!varargs) {
     // The Callable has overridden one of the non-varargs call()
     // methods
     argExpr = gen.make().Ident(makeParamName(gen, argIndex));
   } else {
     // The Callable has overridden the varargs call() method
     // so we need to index into the varargs array
     argExpr =
         gen.make().Indexed(gen.make().Ident(makeParamName(gen, 0)), gen.make().Literal(argIndex));
   }
   // make sure we unbox it if required
   argExpr =
       gen.expressionGen()
           .applyErasureAndBoxing(
               argExpr,
               gen.typeFact().getObjectDeclaration().getType(), // it came in as Object
               true, // it's completely erased
               true, // it came in boxed
               CodegenUtil.getBoxingStrategy(param), // see if we need to box
               parameterTypes.get(argIndex), // see what type we need
               0); // no flags
   return argExpr;
 }