Преимущество получится, когда оно выглядит примерно так:
trait Container[A <: Container[A]] extends Ordered[A] {
def clone: A
def pair: (A, A) = (clone, clone)
}
class MyContainer extends Container[MyContainer] {
def clone = new MyContainer
}
Теперь вы получаете pair
бесплатно, и вы получаете правильный тип возврата. Без такого типа вы должны вручную переопределить каждый метод, возвращающий тот же самый тип (много бессмысленного шаблона), или вы теряете определенность в своих типах, как только вы вызываете неперекрываемый метод.