我是scala的新手,并且在从抽象类型成员继承方面遇到了麻烦。代码是我正在构建的行为树库的基础,以使自己习惯scala。我已将代码简化为最能代表问题的代码:
trait Task {
type DataIn
type DataOut
def run(item: DataIn): (Boolean,Option[DataOut])
}
trait TaskContainer extends Task {
def task: Task
}
case class ResultInverter[I](override val task: Task{
type DataIn = ResultInverter.this.DataIn})
extends TaskContainer {
type DataIn = I
type DataOut = Nothing
override def run(item: DataIn): (Boolean,Option[DataOut])={
val taskOut = task(item)
if (taskOut._1 == true) ((false,None))
else (true,None)
}
}
object TaskTest extends App {
val isPositive = new Task {
type DataIn = Int
type DataOut = Nothing
override def run(item: DataIn): (Boolean,Option[DataOut])={
(item > 0, None)
}
}
println(ResultInverter[Int](isPositive(1)._1))
}
这给出了错误
error: ResultInverter is not an enclosing class
type DataIn = ResultInverter.this.DataIn})
^
error: Task{type DataIn = } does not take parameters
val taskOut = task(item)
^
error: stable identifier required, but .this found.
type DataIn = ResultInverter.this.DataIn})
^
error: Task{type DataIn = Int; type DataOut = Nothing} does not take parameters
val isNegative = ResultInverter[Int](isPositive(1)._1
我认为错误来自type DataIn = ResultInverter.this.DataIn
行。我尝试将其更改为type DataIn = ResultInverter#DataIn
,但在错误方面几乎没有变化。我之前在java中编程过,所以会使用类型参数而不是类型成员,但我很确定推荐使用类型成员。
感谢您的帮助
答案 0 :(得分:1)
您无法在构造函数的签名中引用this
。在调用构造函数时,还没有this
。在您的情况下,您可以改为使用I
。
case class ResultInverter[I](task: Task{ type DataIn = I }) extends TaskContainer { ... }
其他错误是因为您尝试调用apply
方法(a(b)
转换为a.apply(b)
),但Task
只有run
方法。