2017-06-14 48 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