首页 文章

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

提问于
浏览
15

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

abstract class Buffer {
  type T
  val element: T
}

而是泛型,例如

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

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

PS Code代码段是受欢迎的 .

3 回答

  • 2

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

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

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

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

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

    abstract class Buffer[T] { self: T =>
      val element: T
    }
    
  • 5
    // 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 }
    

相关问题