2

我对 Lift 的 Mapper 和 Record 框架中的标准模式感到困惑:

trait Mapper[A<:Mapper[A]] extends BaseMapper {
  self: A =>
  type MapperType = A

Mapper trait 的类型参数是什么意思?类型A是Mapper的参数,要求是Mapper[A]的子类,怎么可能,或者我只是不明白这个定义的意思。

4

1 回答 1

2

此模式用于能够捕获 的实际子类型Mapper,这对于在方法中接受该确切类型的参数很有用。

传统上,您不能声明该约束:

scala> trait A { def f(other: A): A  }
defined trait A

scala> class B extends A { def f(other: B): B = sys.error("TODO") }
<console>:11: error: class B needs to be abstract, 
since method f in trait A of type (other: A)A is not defined
(Note that A does not match B)
   class B extends A { def f(other: B): B = sys.error("TODO") }

当您可以访问精确类型时,您可以执行以下操作:

scala> trait A[T <: A[T]] { def f(other: T): T  }
defined trait A

scala> class B extends A[B] { def f(other: B): B = sys.error("TODO") }
defined class B

请注意,这也可以通过有界类型成员实现:

 trait A { type T <: A; def f(other: T): T }
 class B extends A { type T <: B; def f(other: T): T = sys.error("TODO") }
于 2012-09-13T22:23:16.540 回答