Ответ 1
Начиная с Scala 2.8, параметризованные типы с параметрами имеют еще более ограниченные возможности через классы ограничения обобщенного типа. Эти классы предоставляют дополнительную специализацию в методах и дополняют границы контекста следующим образом:
A =: = B утверждает, что A и B должны быть равными
A < B утверждает, что A должен быть подтипом B
Пример использования этих классов будет заключаться в том, чтобы включить специализацию для добавления числовых элементов в коллекции или для форматирования печати на заказ или для расчета индивидуальных обязательств по конкретным типам ставок или фондов в портфеле трейдеров. Например:
case class PrintFormatter[T](item : T) {
def formatString(implicit evidence: T =:= String) = { // Will only work for String PrintFormatters
println("STRING specialised printformatting...")
}
def formatPrimitive(implicit evidence: T <:< AnyVal) = { // Will only work for Primitive PrintFormatters
println("WRAPPED PRIMITIVE specialised printformatting...")
}
}
val stringPrintFormatter = PrintFormatter("String to format...")
stringPrintFormatter formatString
// stringPrintFormatter formatPrimitive // Will not compile due to type mismatch
val intPrintFormatter = PrintFormatter(123)
intPrintFormatter formatPrimitive
// intPrintFormatter formatString // Will not compile due to type mismatch
Здесь вы можете найти полный короткий курс о типах Scala: http://scalabound.org/?p=323