code: public SoyExpression unboxAsString() {
      if (alreadyUnboxed(String.class)) {
        return this;
      }
      assertBoxed(String.class);
  
      Expression unboxedString;
      if (delegate.isNonNullable()) {
        unboxedString = delegate.invoke(MethodRef.SOY_VALUE_STRING_VALUE);
      } else {
        unboxedString =
            new Expression(BytecodeUtils.STRING_TYPE, features()) {
              @Override
              protected void doGen(CodeBuilder adapter) {
                Label end = new Label();
                delegate.gen(adapter);
                BytecodeUtils.nullCoalesce(adapter, end);
                MethodRef.SOY_VALUE_STRING_VALUE.invokeUnchecked(adapter);
                adapter.mark(end);
              }
            };
      }
      return forString(unboxedString);
    }
docs: Unboxes this to a {@link SoyExpression} with a String runtime type.
  
  <p>This method is appropriate when you know (likely via inspection of the {@link #soyType()},
  or other means) that the value does have the appropriate type but you prefer to interact with
  it as its unboxed representation. If you simply want to 'coerce' the given value to a new type
  consider {@link #coerceToString()} which is designed for that use case.