Antlr Stringtemplate模板参数始终计算为字符串

Antlr Stringtemplate模板参数始终计算为字符串,antlr,stringtemplate,antlr4,Antlr,Stringtemplate,Antlr4,我正在使用AntlR4RC1(完整的jar)解析语法,构建自定义ast,并使用stringtemplate4从该ast生成代码(我在AntlRJAR中使用stringtemplate类)。 在一个模板中,我调用另一个带有bean列表的模板 <subtemplate(myListArg=parm.listOfBeans)> 然后在子模板中,我得到一个字符串列表(每个字符串都是一个计算为字符串的bean)。但是我需要的是java bean的列表(例如带有属性的简单java对象),因

我正在使用AntlR4RC1(完整的jar)解析语法,构建自定义ast,并使用stringtemplate4从该ast生成代码(我在AntlRJAR中使用stringtemplate类)。 在一个模板中,我调用另一个带有bean列表的模板

<subtemplate(myListArg=parm.listOfBeans)>

然后在子模板中,我得到一个字符串列表(每个字符串都是一个计算为字符串的bean)。但是我需要的是java bean的列表(例如带有属性的简单java对象),因为我想要处理bean的属性,而不是bean的值,例如

<subtemplate(myListArg)> ::= <<
  <myListArg: {x | {... <x.someProperty> ...}>
>>
:=>

在我看来,模板的参数总是计算为字符串。这是故意的行为吗?如果是,我还应该写什么?

StringTemplate 4在调用子模板时不会将数组或列表的成员呈现为字符串,如下所示Edit:尽管在这篇文章的评论中有相反的说法,我重申ST4在调用子模板时不会将数组或列表的成员呈现为字符串。数组或列表中存储的元素类型没有区别

应用程序中必须出现以下情况之一:

  • myListArg
    实际上不是字符串列表(即,您将获得意外的输出,但并非出于此处列出的原因)
  • 您为
    parm
    类型注册了一个
    modeldadapter
    ,它将返回属性
    listobeans
  • parm
    的类型有一个
    getListOfBeans
    方法,该方法返回字符串列表
  • 第(3)项不成立,并且
    parm
    的类型有一个listOfBeans字段,它是一个字符串列表
  • 编辑:关于列表与数组的问题,我执行了上面的单元测试,将
    newclazz(Integer.class)
    而不是
    Integer.class
    传递到
    start
    模板:

    private static class Clazz {
        private final Class<?> clazz;
    
        public Clazz(Class<?> clazz) {
            this.clazz = clazz;
        }
    
        public List<Field> getFields() {
            return Arrays.asList(clazz.getFields());
        }
    }
    
    私有静态类Clazz{
    私人期末班;
    公共课(班级课){
    this.clazz=clazz;
    }
    公共列表getFields(){
    返回Arrays.asList(clazz.getFields());
    }
    }
    
    非常感谢。这对我很有帮助。class.fields的类型为
    字段[]
    。在我的例子中,myListArg的类型是
    java.util.List
    。我把myListArg转换成了一个数组,它成功了。我不知道stringtemplate是否打算以不同的方式处理数组和列表作为参数,但至少现在我有了一个解决方法。要么将所有列表转换为数组,要么添加一个额外的数组字段。再次感谢你的帮助。我发现了更多。数组中的类型是转换为字符串还是按原样转换,取决于该类型实现的toString()。因此,如果您想知道为什么在这样的代码中,模板的参数是字符串,请尝试删除javabean的toString()方法。我编辑了我的答案,以澄清我在数组和
    列表
    接口上执行此测试的结果是相同的。我还使用实现了
    toString
    的字段包装器执行了测试。我还对答案进行了编辑,以澄清上述评论具有误导性,并且包含不正确的信息。
    MIN_VALUE
    MAX_VALUE
    TYPE
    SIZE
    
    private static class Clazz {
        private final Class<?> clazz;
    
        public Clazz(Class<?> clazz) {
            this.clazz = clazz;
        }
    
        public List<Field> getFields() {
            return Arrays.asList(clazz.getFields());
        }
    }