Scala中集合中的通用类型类

时间:2011-11-30 14:58:34

标签: generics scala types collections typing

我遇到了一个我在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))
        }
    }
}

这里,Channel [T,U]可以看作是将事件[T]从EventSource [T]传播到EventSource [U]的一种方式。仅当过滤器函数为true时才会发生该事件,如果是,则将该事件传递给map,并将其结果发送。

这个类似乎可以正确编译和运行。我的问题是我想将几个Channel附加到EventSource [T]实例,因此它可以将Occurrences传播到几个不同类型的不同EventSource。我的困惑基本上是如何做到这一点:

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))

附加是真正的问题吗?

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您可以使用Any:

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

编辑:您使用追加复制的代码示例是什么?因为我注意到你错过了Channel的类型。 此外,如果您只想在列表中添加一个元素,则可以使用cons,它会在列表的开头添加新元素:

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

如果您出于某种原因绝对想要将新元素添加到该列表的 end ,则可以使用:+

答案 1 :(得分:1)

要保持打字,您确实需要使用通配符_类型。这允许您以这样的方式定义列表,即在将列表添加到列表时关注Channel类型的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 ) }
  }
}