2011-11-30 65 views
4

我遇到了我在Scala中創建的泛型類的問題。我有以下類:Scala中的集合中的一般類型的類

class Channel[T, U](val endPoint : EventSource[U], val filter : Occurrence[T] => Boolean, 
    val map : Occurrence[T] => Occurrence[U]) { 

    def send(occurrence : Occurrence[T]) { 
     if (filter(occurrence)) { 
      endPoint.occur(map(occurrence)) 
     } 
    } 
} 

這裏一個信道[T,U]可以被看作是從EventSource的[T]至EventSource的[U]中傳播的發生[T]的方法。只有在過濾器函數爲true時纔會發送該事件,如果是,則將事件傳遞給map並將其結果發送出去。

這個類似乎編譯和功能正常。我的問題是,我想將幾​​個通道附加到EventSource [T]實例,以便它可以將發生次數傳播到不同類型的幾個不同EventSources。我的困惑基本上是這樣做的:

class EventSource[T] { 
    var List[Channel[T,U]] list = ... 
} 

你在這裏是什麼? T簡單地從list所屬的EventSource中的類型T引用(是其成員)。

對不起,如果這是一個模糊或混亂!

編輯:我應該指出的是,我也希望能夠追加到此列表中:

list = list ++ List[Channel[T, U](new Channel[T, U](endPoint, filter, map)) 

是追加真正的問題?

回答

1

要保持打字你真的需要使用通配符_類型。這使您可以在添加到列表時關注通道類型的U參數的方式中定義列表,但不能在將事件發送到列表中的所有通道時使用這種方式。下面的編譯,但它現在是相當圓形的。您需要一個通道的子類,而不是將其發送到另一個EventSource。

class Occurrence[T] 
class Channel[T, U](val endPoint : EventSource[U], val filter : Occurrence[T] => Boolean, 
    val map : Occurrence[T] => Occurrence[U]) { 
    def send(occurrence : Occurrence[T]) { 
     if (filter(occurrence)) 
      endPoint.occur(map(occurrence)) 
    } 
} 
class EventSource[T] { 
    var list: List[Channel[T,_]] = Nil 
    def addChannel[U](endPoint : EventSource[U], filter : Occurrence[T] => Boolean, map : Occurrence[T] => Occurrence[U]) { 
    list = list ++ List[Channel[T, U]](new Channel[T, U](endPoint, filter, map)) 
    } 
    def occur(occurrence : Occurrence[T]) { 
    list foreach { _.send(occurrence) } 
    } 
} 
+0

「你需要一個子類信道的除了將其發送到另一個EventSource之外,還會做其他事情「 - 我不明白你的意思。 – seadowg

2

如果我正確理解你的問題,你可以使用任何:

class EventSource[T] { 
    val list: List[Channel[T, Any]] = ... 

編輯:是您的代碼示例,你用追加複製?因爲我注意到你錯過了Channel的類型。 此外,如果你只是想將一個元素添加到列表中,您可以使用利弊,其中在列表的開頭添加新元素:

Channel[Your, Types](your, para, meters)::list 

如果你因爲某些原因絕對要添加新元素到該列表的結尾,則可以使用:+

+0

我以前試過,但它不適用於附加。我已經用我的意思更新了這個問題。 – seadowg

+0

這個令人討厭的問題與U在Channel中不變相同,因此一個 'Channel [T,U]'(其中U是任何東西)不能'列入'List [T,Any]。感謝您的幫助和快速更新? – seadowg

+0

@Oetzi,你不得不在輸入時輸入Channel,這意味着你不能寫'Channel [T,U] :: list',你必須寫'Channel [Real,Type] :: list'。還是我誤解了你?什麼是你得到的錯誤信息? – ln2v