code: public SmartBinder castVirtual(Class<?> returnType, Class<?> firstArg, Class<?>... restArgs) {
          return new SmartBinder(this, new Signature(returnType, firstArg, restArgs, signature().argNames()), binder.castVirtual(returnType, firstArg, restArgs));
      }
docs: Cast the incoming arguments to the return, first argument type, and
  remaining argument types. Provide for convenience when dealing with
  virtual method argument lists, which frequently omit the target
  object.
  
  @param returnType the return type for the casted signature
  @param firstArg   the type of the first argument for the casted signature
  @param restArgs   the types of the remaining arguments for the casted signature
  @return a new SmartBinder with the cast applied.