Почему 2.10 настаивает на указании границ параметра типа (отлично работало в 2.9)?

У меня есть следующий класс case:

case class Alert[T <: Transport](destination: Destination[T], message: Message[T])

В Scala 2.9.2 следующая сигнатура метода скомпилирована нормально:

def send(notification: Alert[_]) {
  notification match {
    ...
  }
}

Теперь в Scala 2.10.1 не компилируется со следующей ошибкой:

type arguments [_$1] do not conform to class Alert's type parameter bounds [T <: code.notifications.Transport]

Почему это? Как я могу исправить ошибку? Простое указание границ одного и того же типа для send приводит к гораздо большему количеству ошибок компиляции...

Обновление: смотрите SIP-18, я не думаю, что причина в том, что у меня не включены экзистенциальные типы, поскольку SIP-18 говорит, что это необходимо только для типов без подстановочных знаков, что у меня здесь и есть.


person pr1001    schedule 02.04.2013    source источник


Ответы (1)


Похоже, что ошибка говорит о том, что экзистенциальный тип «_» не ограничен быть подтипом Transport. Это может быть предпочтительным решением,

trait Transport
trait Destination[T]
trait Message[T]
case class Alert[T <: Transport](destination: Destination[T], message: Message[T])

def send[T <: Transport](notification: Alert[T]) {
  notification match {
    case _ => ()
  }
}

Это также, кажется, работает,

def send(notification: Alert[_ <: Transport])

но я думаю, что предпочтительнее не использовать экзистенциальные типы.

person Kipton Barros    schedule 02.04.2013
comment
Я уже пробовал первый подход, и он просто вызывал больше ошибок компилятора, но второй работает для меня. - person pr1001; 02.04.2013
comment
Что касается отказа от использования экзистенциальных типов, что бы вы порекомендовали instance? - person pr1001; 02.04.2013
comment
Я не получаю никаких ошибок компиляции при первом подходе — может быть, вам нужно включить больше кода, чтобы они появились? - person Kipton Barros; 02.04.2013
comment
Извините, конечно. Затем я получаю: type mismatch; [error] found : Seq[code.notifications.Alert[Product with Serializable with code.notifications.Transport]] [error] required: Seq[code.notifications.Alert[T]] [error] def toAlerts[T <: Transport]: Seq[Alert[T]] = subject.toSeq.flatMap(subject => { - person pr1001; 02.04.2013
comment
Но да, в основном я пытаюсь следовать цепочке назад, и я продолжаю получать эти ошибки о том, что Product with Serializable with code.notifications.Transport не соответствует T, где T <: Transport. - person pr1001; 02.04.2013
comment
Я хотел бы помочь, но я не могу воспроизвести ваши ошибки с кодом, который вы разместили. Если вы можете опубликовать больше кода, я мог бы попытаться отладить ошибки. - person Kipton Barros; 03.04.2013
comment
Спасибо, Киптон, я думаю, что сейчас проще всего использовать ваше решение. - person pr1001; 03.04.2013