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]に伝播する方法と見なすことができます。オカレンスは、フィルター関数がtrueの場合にのみ送信され、trueの場合、オカレンスはマップに渡され、その結果が送信されます。

このクラスは正しくコンパイルおよび機能しているようです。私の問題は、複数のチャネルをEventSource [T]インスタンスにアタッチして、オカレンスをさまざまなタイプのいくつかの異なるイベントソースに伝播できるようにすることです。私の混乱は基本的にこれを行う方法です:

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

ここのUは何ですか?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のタイプが欠落していることに気付いたからです。また、リストに1つの要素を追加するだけの場合は、consを使用できます。これにより、リストの先頭に新しい要素が追加されます。

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

何らかの理由でそのリストの最後に新しい要素を絶対に追加したい場合は、を使用できます:+

于 2011-11-30T15:42:41.060 に答える
1

タイピングを維持するには、ワイルドカード_typeを使用する必要があります。これにより、リストに追加するときにチャネルタイプの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 ) }
  }
}
于 2011-12-02T03:50:42.093 に答える