簡體   English   中英

EMF通用清單

[英]EMF generic List

我的模型包含一個名為Result的接口。 我有多個實現上述接口的類。 現在我想將結果列表添加為結果。 我希望能夠像這樣創建某事:

列表<ResultImplA>

, 哪一個

  • 只能包含所選的Resulttype
  • 實現我的Result接口,
  • 是一個EObject(可以包含在Elists等中)
  • 可以通過EMF(DomainFactory.eINSTANCE.create ...()

我嘗試使用涵蓋1和2的EMF泛型,但是無法在代碼中創建它們。 我只能將其用作指定泛型的其他類的超類,但我不想為所有結果創建其他List類。 DomainFactory僅向我提供ResultList <Result>的實現。

我不太確定您要完成什么。 您想要一個類,它是一個EList和一個Result嗎? 從技術上講,這是可行的,並且可以通過擴展BasicEList或實現EList類來實現:

class ResultImpl extends BasicEList<E> implements Result

要么

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

但這都是無稽之談,無論哪種方式,您都需要自己實現大量方法,並且可能會不斷使EMF崩潰...

您可以做的是:讓一個EClass說“ ResultList ”,將您的Result作為超類,然后在其中添加一個EReference (name =“ results”,EType: Result ,(upperbound:-1)。因此,您可以生成一個Class這基本上是Results EObject的包裝器。

此外:為了使您的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()方法,該方法僅返回您的自定義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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM