2011-11-30 79 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