我正在按照一个试图解释自我类型用法的教程。以下示例使用self类型来表示任何Writeable对于其自己的类型是可写的。
trait Writes[In, Out] {
def write(in: In): Out
}
trait Writeable[Self] {
def write[Out]()(implicit writes: Writes[Self, Out]): Out =
writes.write(this)
}
我在调用类型为Writes [Self,Out]的 write 函数时遇到编译错误。直觉上,这应该有效,因为write [in]的参数是Self类型。然而,编译器说没有......
found : Writable.this.type (with underlying type Writeable[Self])
required: Self
writes.write(self)
表达这些类型和关系的正确方法是什么?
我不确定该教程是否针对旧版本的Scala。另外,请原谅我无法正确表达问题,我是Scala的新手。
答案 0 :(得分:0)
你问题中的代码显然应该不编译,这对Scala编译器来说不是问题(你会发现没有可以编译它的版本,无论你走多远)。我不知道你正在阅读什么样的教程,但我有理由确定你想要这个:
trait Writes[In, Out] {
def write(in: In): Out
}
trait Writeable[Self] { self: Self =>
def write[Out]()(implicit writes: Writes[Self, Out]): Out =
writes.write(this)
}
这样编译得很好,因为现在您已通过this
- 自我类型声明强制Self
类型为self: Self =>
。