Значения совершенно разные.C <: Seq[A]
означает, что C
является подтипом Seq[A]
, как вы знаете;xs: C with Seq[A]
не накладывает никаких ограничений на C
, но означает, что xs
должно быть и C
, и Seq[A]
.Поэтому обычно вы должны использовать тот, который вы на самом деле имеете в виду.
В def f[A,C <: Seq[A]](xs: C)
проблема в том, что компилятор Scala не может вывести A
, поскольку он явно не указан в типе аргументов.Я не вижу никакой причины в принципе, это не может сделать вывод A
;это просто не в настоящее время.Замена типа на C with Seq[A]
означает, что A
теперь появляется в типе xs
и позволяет компилятору выводить A
.Таким образом, если вы действительно имеете в виду ограничение, но A
подразумеваете вывод, вам на самом деле нужно написать
implicit def f[A,C <: Seq[A]](xs: C with Seq[A])
вместо вашего третьего определения, и это то, что делает ответ на связанный вопрос.