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

Generics 是否有使用泛型无法实现的scala抽象类型使用示例?,generics,scala,abstract-type,Generics,Scala,Abstract Type,有两种可能的方式来表示对类型的抽象 abstract class Buffer { type T val element: T } 而不是泛型,例如 abstract class Buffer[T] { val element: T } 我理解在不同的环境中使用不同方法的好处。 但我感兴趣的例子是,绝对不可能将抽象类型版本转换为泛型版本 欢迎使用PS代码片段。抽象类型可以绑定到路径依赖类型,这在类型参数中是不可能的。因此,例如,您可以使用具体的内部类实现抽象类型: // This

有两种可能的方式来表示对类型的抽象

abstract class Buffer {
  type T
  val element: T
}
而不是泛型,例如

abstract class Buffer[T] {
  val element: T
}
我理解在不同的环境中使用不同方法的好处。 但我感兴趣的例子是,绝对不可能将抽象类型版本转换为泛型版本


欢迎使用PS代码片段。

抽象类型可以绑定到路径依赖类型,这在类型参数中是不可能的。因此,例如,您可以使用具体的内部类实现抽象类型:

// 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 }
trait A { type T }
class B extends A { class T }
或者显式地将其绑定到类范围内的路径依赖类型:

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

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

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

但我不能用泛型做什么呢?1.示例可以很容易地转换为“trait M[TM];trait P[TP]扩展了M[TP]”。2.根本不编译,所以没有什么可以转换的。。。