我对 Lift 的 Mapper 和 Record 框架中的标准模式感到困惑:
trait Mapper[A<:Mapper[A]] extends BaseMapper {
self: A =>
type MapperType = A
Mapper trait 的类型参数是什么意思?类型A是Mapper的参数,要求是Mapper[A]的子类,怎么可能,或者我只是不明白这个定义的意思。
此模式用于能够捕获 的实际子类型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") }