【问题标题】:EMF generic ListEMF 通用列表
【发布时间】:2016-06-24 16:13:33
【问题描述】:

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

列表

,其中

  • 只能包含选定的结果类型
  • 实现我的 Result 接口,
  • 是一个EObject(可以包含在Elist等中)
  • 具体实例可以通过 EMF 生成(Dom​​ainFactory.eINSTANCE.create...()

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

【问题讨论】:

    标签: java list generics emf


    【解决方案1】:

    我不太确定您要完成什么。 您想要一个类,即EListResult? 从技术上讲,这是可能的,可以通过扩展BasicEList 或实现EList 类来实现:

    class ResultImpl extends BasicEList<E> implements Result
    

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

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

    你可以做的是:让一个 EClass 说“ResultList”,它有你的Result 作为超类并添加一个EReference(名称=“结果”,EType:Result,(上界:- 1)给它。 因此,您可以生成一个基本上是 Results EObjects 的包装器的类。

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

    for(Result r : aResultList)
    

    您可以在您的ResultList 类中实现java.lang.Iterable&lt;Result&gt; 接口,并在您的ResultList 类中创建您自己的自定义java.util.Iterator&lt;Result&gt; 嵌套类,它直接为您提供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&lt;Result&gt; iterator()方法,它只是返回你自定义的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();
    

    【讨论】:

    • 我正是想要这个:“你可以做的是:让一个 EClass 说“ResultList”,它有你的 Result 作为超类并添加一个 EReference (name = "results", EType: Result, (上限:-1)。所以你可以生成一个基本上是结果 EObjects 的包装器的类。“但不是结果,而是结果类型的通用,我希望它只包含结果的一个子类型。
    • 我希望能够在运行时生成它们,因此它们只能包含例如 ResultA 或 ResultB。这有意义吗?
    • 有点。你需要泛型。将“EType 参数”添加到您的 EClass,将其命名为“T”,然后添加 EType 的 EReference:T;或者如果你想让它更灵活:只需使用 EObject 作为引用类型
    • 这看起来是正确的,但是如何从 java 代码创建实例?
    • 如我如何创建 ResultList 而无需在 emf 中创建新类?
    猜你喜欢
    • 2012-07-17
    • 2020-06-04
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多