EMF通用列表

时间:2016-06-22 13:06:35

标签: java list generics emf

我的模型包含一个名为Result的界面。我有多个实现所述接口的类。现在我想添加结果列表作为结果。我希望能够创建像:

列表< ResultImplA>

  • 只能包含所选的Resulttype
  • 实现我的Result接口,
  • 是EObject(可以包含在Elists等中)
  • 具体实例可以通过EMF生成(Dom​​ainFactory.eINSTANCE.create ...()

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

1 个答案:

答案 0 :(得分:2)

我不太清楚你想要完成什么。 你想要一个EListResult的班级? 从技术上讲,这是可能的,可以通过扩展BasicEList或实施EList类来实现:

class ResultImpl extends BasicEList<E> implements Result

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

但这都是胡说八道,无论哪种方式,你都需要自己实施大量的方法,并且可能会不断地使EMF崩溃......

你能做的是:让一个EClass说&#34; ResultList&#34;将Result作为超级类并添加EReference(名称=&#34;结果&#34;,EType:Result,(上限:-1)。 因此,您可以生成一个Class,它基本上是Results EObjects的包装器。

此外:让ResultList&#39;表现出来&#39;像List一样,例如在循环中:

for(Result r : aResultList)

您可以在java.lang.Iterable<Result>班级中实施ResultList界面,并在java.util.Iterator<Result>班级中创建自己的自定义ResultList嵌套班级,该班级会为您提供EReference直接:

例如嵌套的Iterator类(嵌套在ResultList类中):

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()方法,该方法只返回您的自定义迭代器:

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

更新: 如果您决定使用通用EType参数创建一个EClass并且想要创建此类的实例,那么在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();