EMF 通用列表
EMF generic List
我的模型包含一个名为 Result 的接口。我有多个实现所述接口的 classes。现在我想将结果列表添加为结果。我希望能够创建这样的东西:
列表
,其中
- 只能包含所选的结果类型
- 实现我的结果接口,
- 是一个EObject(可以包含在Elists等中)
- 可以通过 EMF 生成具体实例 (DomainFactory.eINSTANCE.create...()
我尝试使用涵盖 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();
我的模型包含一个名为 Result 的接口。我有多个实现所述接口的 classes。现在我想将结果列表添加为结果。我希望能够创建这样的东西:
列表
,其中
- 只能包含所选的结果类型
- 实现我的结果接口,
- 是一个EObject(可以包含在Elists等中)
- 可以通过 EMF 生成具体实例 (DomainFactory.eINSTANCE.create...()
我尝试使用涵盖 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();