gpt4 book ai didi

java - EMF 通用列表

转载 作者:行者123 更新时间:2023-11-30 02:53:25 26 4
gpt4 key购买 nike

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

列表

,其中

  • 只能包含所选的结果类型
  • 实现我的结果接口(interface),
  • 是一个 EObject(可以包含在 Elists 等中)
  • 可以通过 EMF 生成具体实例 (DomainFactory.eINSTANCE.create...()

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

最佳答案

我不太确定你想要实现什么目标。你想要一个类,它是 EList和一个 Result ?从技术上讲,这是可能的,并且可以通过扩展 BasicEList 来实现或实现EList类:

class ResultImpl extends BasicEList<E> implements Result

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

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

你可以做的是:让一个 EClass 说“ResultList ”,其中有你的 Result作为 super 类并添加 EReference (name = "results", EType: Result , (上限: -1) 。所以你可以生成一个类,它基本上是 Results 的包装器。 E对象。

进一步:使您的ResultList像列表一样“表现”,例如在循环中:

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

@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();

关于java - EMF 通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com