继承抽象类型导致错误,表明该类不是封闭类

时间:2017-06-14 19:16:05

标签: scala inheritance types

我是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中编程过,所以会使用类型参数而不是类型成员,但我很确定推荐使用类型成员。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您无法在构造函数的签名中引用this。在调用构造函数时,还没有this。在您的情况下,您可以改为使用I

case class ResultInverter[I](task: Task{ type DataIn = I }) extends TaskContainer { ... }

其他错误是因为您尝试调用apply方法(a(b)转换为a.apply(b)),但Task只有run方法。