Типизированные классы в коллекциях в Scala - PullRequest
4 голосов
/ 30 ноября 2011

У меня проблема с общим классом, который я создаю в 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] можно рассматривать как способ передачи Вхождения [T] из EventSource [T] в EventSource [U].Вхождение отправляется только в том случае, если функция фильтра имеет значение true, и если это так, вхождение передается на карту, и результат этого отправляется.

Этот класс, кажется, компилируется и функционирует правильно.Моя проблема заключается в том, что я хочу подключить несколько каналов к экземпляру EventSource [T], чтобы он мог распространять события в нескольких различных источниках событий различных типов.Моя путаница в основном, как это сделать:

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

Что такое U здесь?На T просто ссылаются из типа T в EventSource, к которому list принадлежит (является членом).

Извините, если это расплывчато или запутанно!

РЕДАКТИРОВАТЬ: Я должен иметьотметил, что я также хочу иметь возможность добавить в этот список, как в:

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

Является ли добавление реальной проблемой?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Если я правильно понимаю вашу проблему, вы можете использовать любое:

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

РЕДАКТИРОВАТЬ: ваш пример кода, где вы используете добавление скопированы? Потому что я заметил, что вам не хватает типов для канала. Кроме того, если вы просто хотите добавить один элемент в свой список, вы можете использовать cons, который добавляет новый элемент в начало вашего списка:

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

Если вы по какой-то причине абсолютно хотите добавить новый элемент в end этого списка, вы можете использовать :+.

1 голос
/ 02 декабря 2011

Для продолжения набора текста вам действительно нужно использовать подстановочный знак _ тип .Это позволяет вам определять список таким образом, чтобы вы заботились о параметре U типа Channel при добавлении его в список, а не при отправке вхождения на все каналы в списке.Следующие компиляции, но в том виде, в каком они есть, довольно круглые.Вам нужен подкласс канала, который делает что-то другое, кроме отправки его в другой 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 ) }
  }
}
...