2017-06-14 50 views
1

我是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

你不能在构造函数的特征参考this。在调用构造函数的时刻,还没有this。在你的情况下,你可以使用I来代替。

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

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

+0

您的回复。很高兴知道更多关于类型成员的信息,并感谢在调用apply方法时指出我的错误。这是我错过的一种错误,如果有人没有指出它,错过了。 – Nat2726