我必须使用从我的DSL生成的类实现一个外部接口。要实现的方法之一具有以下签名:
public void execute(SomeType<? extends OtherType> param1, ...) {...}
在 JvmModelInferrer 中,我将 DSL 的相应元素映射到一个方法上,并添加了如下参数:
parameters += appRule.toParameter("param1", appRule.newTypeRef(SomeType, it.newTypeRef("? extends OtherType")))
它几乎可以工作,但生成一个非常奇怪的输出:
public void execute(final /*SomeType<? extends OtherType> */Object param1, ...) {...}
我想可能有其他设置来强制生成器使用我提供的通用参数,但实际上找不到它。
基本上,您应该在模型中设置类型参数,而不是在字符串中创建它。为此,我们在EMF-IncQuery中使用以下结构:
it.parameters += pattern.toParameter("processor",
pattern.newTypeRef(typeof (IMatchProcessor),
cloneWithProxies(matchClassReference).wildCardSuper))
在这里,cloneWithProxies 由 JvmTypesBuilder 提供(可以注入),而 wildCardSuper 是我们编写的辅助方法:
public JvmWildcardTypeReference wildCardSuper(JvmTypeReference clone) {
JvmWildcardTypeReference result = factory.createJvmWildcardTypeReference();
JvmLowerBound lowerBound = factory.createJvmLowerBound();
lowerBound.setTypeReference(clone);
result.getConstraints().add(lowerBound);
return result;
}