2013-04-02 6 views
4

я следующий класс случай:Почему 2.10 настаивает на определении границ параметра типа (отлично работает в 2.9)?

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 говорит, что это необходимо только для типов без подстановочных знаков, что и есть то, что у меня есть.

ответ

2

Ошибка, кажется, говорит о том, что экзистенциальный тип «_» не является подтипом 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]) 

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

+0

Я уже пробовал первый подход, и он просто вызвал больше ошибок компилятора, но второй работает для меня. – pr1001

+0

Что касается не использования экзистенциальных типов, что бы вы посоветовали вам? – pr1001

+0

У меня нет ошибок компиляции с первым подходом - возможно, вам нужно включить больше кода, чтобы они отображались? –

 Смежные вопросы

  • Нет связанных вопросов^_^