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.根本不编译,所以没有什么可以转换的。。。