docs: public SoyExpression unboxAsList() {
      if (alreadyUnboxed(List.class)) {
        return this;
      }
      assertBoxed(List.class);
  
      Expression unboxedList;
      if (delegate.isNonNullable()) {
        unboxedList = delegate.checkedCast(SOY_LIST_TYPE).invoke(MethodRef.SOY_LIST_AS_JAVA_LIST);
      } else {
        unboxedList =
            new Expression(BytecodeUtils.LIST_TYPE, features()) {
              @Override
              protected void doGen(CodeBuilder adapter) {
                Label end = new Label();
                delegate.gen(adapter);
                BytecodeUtils.nullCoalesce(adapter, end);
                adapter.checkCast(SOY_LIST_TYPE);
                MethodRef.SOY_LIST_AS_JAVA_LIST.invokeUnchecked(adapter);
                adapter.mark(end);
              };
            };
      }
  
      ListType asListType;
      if (soyType().getKind() != Kind.NULL
          && soyRuntimeType.asNonNullable().isKnownListOrUnionOfLists()) {
        asListType = soyRuntimeType.asNonNullable().asListType();
      } else {
        Kind kind = soyType().getKind();
        if (kind == Kind.UNKNOWN || kind == Kind.NULL) {
          asListType = ListType.of(UnknownType.getInstance());
        } else {
          // The type checker should have already rejected all of these
          throw new UnsupportedOperationException("Can't convert " + soyRuntimeType + " to List");
        }
      }
      return forList(asListType, unboxedList);
    }