有两种可能的方式来表达类型的抽象 .
abstract class Buffer { type T val element: T }
而是泛型,例如
abstract class Buffer[T] { val element: T }
我理解在不同环境中使用不同方法的可用性的好处 . 但我很感兴趣的是将Abstract Type版本转换为Generic版本是绝对不可能的 .
PS Code代码段是受欢迎的 .
抽象类型可以绑定到路径依赖类型,这是类型参数无法实现的 . 因此你可以例如实现具有具体内部类的抽象类型:
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 }
// 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 }
3 回答
抽象类型可以绑定到路径依赖类型,这是类型参数无法实现的 . 因此你可以例如实现具有具体内部类的抽象类型:
或者在类范围内将它显式绑定到路径依赖类型:
另一个区别:只有类型参数可以用作自我类型,