在Scala Mapper / Record traits中键入上限

时间:2012-09-13 22:03:29

标签: scala lift

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

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

关于Mapper特征的类型参数是什么意思?类型A是Mapper的一个参数,它必须是Mapper [A]的子类,它怎么可能,或者我可能只是不理解这个定义的含义。

1 个答案:

答案 0 :(得分: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") }