将多种类型作为参数传递给Xtend中Iterable对象的过滤器函数

问题描述 投票:0回答:1

我正在使用Xtext的DSL生成器接口,以便基于我的Xtext DSL生成一些模型。一切正常,但是现在编写生成器时我遇到了一些问题。我正在使用生成器过滤掉Xtext DSL中声明的规则。我通过选择某些规则,然后将它们转换为Iterable对象来实现,然后可以使用该对象过滤某些类型(请参见下面的代码中的toIterable.filter()部分)。下面的代码包含一个for循环,它本身又包含3个嵌套的for循环。这些嵌套循环都对一种特定类型的方法语句(我在DSL中声明的类型)进行过滤。我想通过在filter()方法中传递3种类型作为参数,将这3个for循环组合在一个for循环中。在这种情况下,将存在一个嵌套的for循环,条件理想的情况是:

for (eachMethodStatement : ifStatement.expression.eAllContents.toIterable.filter(StatementSort1, StatementSort2, StatementSort3)

问题是filter()方法仅接受一个参数(一种类型),所以现在我必须编写三个称为getDemand的分派方法,它们基本上都相同。它现在可以工作,但是这迫使我为要过滤的每种类型编写很多样板代码。

是否有一种方法可以过滤多种类型(在一个for循环中)而无需创建大量样板代码?

for (ifStatement : ifElseStatement.eAllContents.toIterable.filter(IfStatements)){
    for (persistenceFunction : ifStatement.expression.eAllContents.toIterable.filter(SingleLibraryPersistenceMethodStatement)) {
            expressionDemand += getDemand(persistenceFunction,resourceTable)                            
        }
    for (interfaceFunction : ifStatement.expression.eAllContents.toIterable.filter(SingleLibraryInterFaceMethodStatement)) {                    
            expressionDemand += getDemand(interfaceFunction,resourceTable)                          
        }
    for (businessFunction : ifStatement.expression.eAllContents.toIterable.filter(SingleLibraryBusinessMethodStatement)) {                  
            expressionDemand += getDemand(businessFunction,resourceTable)
        }
    for (persistenceFunction : ifStatement.expression.eAllContents.toIterable.filter(RelationalOperator)) {
            expressionDemand += getDemand(persistenceFunction,resourceTable)                            
        }
}

我正在使用Xtext的DSL生成器接口,以便基于我的Xtext DSL生成一些模型。一切正常,但是现在编写生成器时我遇到了一些问题。我...

xtext iterable xtend
1个回答
0
投票

<T> T filter(Class<T>)不能执行多种类型,因为返回类型不能为T,而是-在极端情况下必须稍后转换的Object

© www.soinside.com 2019 - 2024. All rights reserved.