Есть ли пример использования абстрактного типа в scala, которого невозможно достичь с помощью обобщений? - PullRequest
15 голосов
/ 01 октября 2011

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

abstract class Buffer {
  type T
  val element: T
}

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

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

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

PS Фрагменты кода приветствуются.

Ответы [ 3 ]

10 голосов
/ 01 октября 2011

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

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

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

class C { type T = this.type }
class D { object Q; type T = Q.type }
5 голосов
/ 01 октября 2011

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

abstract class Buffer[T] { self: T =>
  val element: T
}
2 голосов
/ 01 октября 2011
// 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 }
...