4

我在 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] 视为将 Occurrence[T] 从 EventSource[T] 传播到 EventSource[U] 的一种方式。仅当过滤器函数为真时才发送事件,如果是,则将事件传递给 map 并发送结果。

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

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

你在这里是什么?listT 简单地从属于(是其中的成员)的 EventSource 中的类型 T 引用。

抱歉,如果这含糊不清或令人困惑!

编辑:我应该注意到我也希望能够附加到这个列表中,如下所示:

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

附加是真正的问题吗?

4

2 回答 2

2

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

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

编辑:您的代码示例是否复制了使用 append 的地方?因为我注意到您缺少 Channel 的类型。此外,如果您只想在列表中添加一个元素,您可以使用 cons,它将新元素添加到列表的开头:

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

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

于 2011-11-30T15:42:41.060 回答
1

要保持打字,您确实需要使用通配符 _ type。这允许您以这样一种方式定义列表,即您在将 Channel 类型的 U 参数添加到列表时关心它,而不是在向列表中的所有通道发送事件时关心它。以下编译,但就目前而言,它是相当循环的。你需要一个通道的子类来做一些事情,而不是把它发送到另一个事件源。

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 ) }
  }
}
于 2011-12-02T03:50:42.093 回答