Scala使用self作为Type

时间:2018-04-03 01:09:41

标签: scala types

我正在按照一个试图解释自我类型用法的教程。以下示例使用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的新手。

1 个答案:

答案 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 =>