是否可以在Eclipse / EMF中将操作参数建模为vararg?

时间:2018-11-05 13:55:03

标签: java eclipse emf eclipse-emf

我正在尝试找到一种使用vararg输入参数对操作进行建模的方法。

模型应生成如下所示的界面。

/**
 * ...
 * @generated
 */
public interface Content extends EObject {
    /**
     * ...
     * @generated
     */
    List<Definition> getDefinitionsByLabels(String... label);      


}

请不要提供解决方法,因为我正在尝试更新现有(大型)代码库的模型(该模型是“手动”在后代开发的)。

到目前为止,对此进行调查似乎没有希望,但是我不想在这里不提出问题就放弃这一方面。

Example Class Diagram

2 个答案:

答案 0 :(得分:1)

由于EMF的代码生成器不直接支持varargs,因此有人要求将上限设为varargs的标记。 错误报告正在等待处理,即请求的功能不可用: https://bugs.eclipse.org/bugs/show_bug.cgi?id=337052

答案 1 :(得分:1)

如果您想要的是模型类上的var-arg Java方法,并且您不需要正确的EMF操作,则可以解决此问题:

让您的模型类实现一个Java接口,在其中声明vararg方法。

Java文件:

public interface InterfaceWithVarargMethod {
    public void varArgMethod(String... arg);
}

Xcore文件:

@GenModel(modelDirectory="/EMF_Trying/src-gen")
package emf_trying

interface InterfaceWithVarargMethod wraps InterfaceWithVarargMethod {}

class ModelObject extends InterfaceWithVarargMethod {
}

将生成不带var-arg方法的ModelObjectImpl的实现。您必须编辑生成的代码并添加var-arg方法以使代码得以编译:

public class ModelObjectImpl extends MinimalEObjectImpl.Container implements ModelObject {
    /**
     * @generated NOT
     */
    @Override
    public void m(String... arg) {
        // Implementation of var-arg method
    }

    ...
}

也许可以找到该解决方案的一些变体,而无需编辑生成的代码。例如,通过在接口中添加方法的默认实现,然后将手写子类中的方法重写为EClass。