是否有使用泛型无法实现的scala抽象类型用法的示例?

yur*_*ura 15 generics scala abstract-type

有两种可能的方式来表达类型的抽象.

abstract class Buffer {
  type T
  val element: T
}
Run Code Online (Sandbox Code Playgroud)

而是泛型,例如

abstract class Buffer[T] {
  val element: T
}
Run Code Online (Sandbox Code Playgroud)

我理解在不同环境中使用不同方法的可用性的好处.但我很感兴趣的是将Abstract Type版本转换为Generic版本是绝对不可能的.

PS Code代码段是受欢迎的.

Mor*_*itz 10

抽象类型可以绑定到路径依赖类型,这是类型参数无法实现的.因此,您可以实现具有具体内部类的抽象类型:

trait A { type T }
class B extends A { class T }
Run Code Online (Sandbox Code Playgroud)

或者将它显式绑定到类范围内的路径依赖类型:

class C { type T = this.type }
class D { object Q; type T = Q.type }
Run Code Online (Sandbox Code Playgroud)


Kip*_*ros 5

另一个区别:只有类型参数可以用作自我类型,

abstract class Buffer[T] { self: T =>
  val element: T
}
Run Code Online (Sandbox Code Playgroud)