Обычно я предпочитаю [1], потому что, как вы говорите, разработчик не обременен смешиванием (подтипом) TraitB
. Возможно, [2] предпочтительнее, если по какой-то причине желательно , а не , чтобы наследовать конкретные реализации в TraitB
и заставить разработчика сделать выбор среди подтипов TraitB
. Тем не менее, [1] столь же гибок.
Я склонен использовать [2] только в случае необходимости, например, когда тип не является известным классом или признаком,
// Here, Matrix cannot extend type parameter Repr
trait Matrix[+Repr <: Matrix[Repr]] { self: Repr =>
...
}
Обновление. Вот еще одна небольшая разница,
trait B
trait A { self: B => }
def g(ab: A): B = ab // Type mismatch: found A, required B
Это немного раздражает необязательное ограничение , не позволяющее использовать A
в качестве B
, даже если этот тип включен.