我对Lift的Mapper和Record框架中的标准模式感到困惑:
trait Mapper[A<:Mapper[A]] extends BaseMapper {
self: A =>
type MapperType = A
关于Mapper特征的类型参数是什么意思?类型A是Mapper的一个参数,它必须是Mapper [A]的子类,它怎么可能,或者我可能只是不理解这个定义的含义。
答案 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") }