Есть ли пример использования 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 }