我的模型包含一个名为Result的界面。我有多个实现所述接口的类。现在我想添加结果列表作为结果。我希望能够创建像:
列表< ResultImplA>
,
我尝试使用EMF泛型,其中包含1和2,但我无法在我的代码中创建它们。我只能将它用作指定泛型的其他类的超类,但我不想为我的所有结果创建额外的List类。 DomainFactory只为我提供了ResultList的实现<结果>。
答案 0 :(得分:2)
我不太清楚你想要完成什么。
你想要一个EList
和Result
的班级?
从技术上讲,这是可能的,可以通过扩展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();