Есть ли пример использования scala абстрактного типа, которого невозможно достичь с помощью дженериков?

Есть два возможных способа выражения абстракции над типами.

abstract class Buffer {
  type T
  val element: T
}

скорее, что дженерики, например

abstract class Buffer[T] {
  val element: T
}

Я понимаю преимущества в удобстве использования разных подходов в разных контекстах. Но я заинтересован в примерах, где абсолютно невозможно преобразовать версию абстрактного типа в родовую версию.

Отрывки PS Code приветствуются.

Ответы

Ответ 1

Абстрактные типы могут быть привязаны к зависимым от пути типам, которые невозможны с параметрами типа. Таким образом, вы можете, например, реализовать абстрактный тип с конкретным внутренним классом:

trait A { type T }
class B extends A { class T }

или явно привязать его к зависимому от пути типу внутри области классов:

class C { type T = this.type }
class D { object Q; type T = Q.type }

Ответ 2

Другое отличие: только типовые параметры могут использоваться как типы-типы,

abstract class Buffer[T] { self: T =>
  val element: T
}

Ответ 3

// This is possible
trait M { type TM }
trait P[TP] extends M { type TM = TP }

// This is not
trait P[TP]
trait M extends P[TM] { type TM }