EMF 通用列表

EMF generic List

我的模型包含一个名为 Result 的接口。我有多个实现所述接口的 classes。现在我想将结果列表添加为结果。我希望能够创建这样的东西:

列表

,其中

我尝试使用涵盖 1 和 2 的 EMF 泛型,但我无法在我的代码中创建它们。我只能将它用作其他 class 指定泛型的超级 class,但我不想为我的所有结果创建一个额外的列表 class。 DomainFactory 只为我提供了 ResultList< Result > 的实现。

我不太确定你想要完成什么。 你想要一个 Class,一个 EList 和一个 Result? 从技术上讲,这是可能的,可以通过扩展 BasicEList 或实施 EList class:

来实现
class ResultImpl extends BasicEList<E> implements Result

class ResultImpl extends MinimalEObjectImpl.Container implements EList<E>, Result

但这完全是无稽之谈,无论哪种方式,您都需要自己实现大量方法,并且可能会不断使 EMF 崩溃...

你可以做的是:让 EClass 说“ResultList”,其中你的 Result 是超级 Class,然后添加一个 EReference (name = "results", EType: Result, (upperbound: -1) 到它。 因此,您可以生成一个 Class,它基本上是 Results EObjects 的包装器。

进一步:让你的 ResultList 'behave' 像一个列表,例如在循环中:

for(Result r : aResultList)

您可以在 ResultList Class 中实现 java.lang.Iterable<Result> 接口,并在 ResultList 中创建自己的 java.util.Iterator<Result> 嵌套 class Class,直接为您提供 EReference 的元素:

例如嵌套迭代器class(嵌套在您的结果列表class):

private class ResultIterator implements Iterator<Result> {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < size;
        }

        @Override
        public Result next() {
            return results.get(index++);
        }
    }

因为您已经实现了 Iterable 接口,所以您需要实现 public Iterator<Result> iterator() 方法,这只是 returns 您的自定义迭代器:

@Override
public Iterator<Result> iterator() {
    return new ResultIterator();
}

更新: 如果您决定创建一个带有通用 EType 参数的 EClass,并且您想要创建这个 class 的一个实例,那么在您的 factoryImpl 中应该有这样的东西:

/**
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
* @generated
*/
public <T> ResultList<T> createResultList() {
    ResultListImpl<T> resultList = new ResultListImpl<T>();
return resultList;
}

所以你应该可以像这样使用它:

ResultList<Result> someResultList = Yourfactory.eINSTANCE.createResultList();