2017-06-02 147 views
1

我試圖創建ScriptScriptType類。 ScriptType s將產生特定抽象類型的ScriptScript s將由創建它們的ScritpType參數化。scala抽象類型參數化`this.type`

我第一次嘗試是這樣的:

trait Script[Type <: ScriptType] 

sealed trait ScriptType { 
    type S <: Script[this.type] 
} 

object ScriptType { 
    class Scala extends ScriptType { 
    type S = ScalaScript 
    } 
} 

import ScriptType._ 

case class ScalaScript(source: String) extends Script[Scala] 

但即時得到一個錯誤的編譯關於type SScriptType.Scala

Error:(10, 10) overriding type S in trait ScriptType with bounds <: Script[Scala.this.type]; 
    type S has incompatible type 
    type S = ScalaScript 

在這個例子中,分配是ScalaScript不是Script[Scala.this.type]

回答

2

ScalaScript不是Script[Scala.this.type],因爲this.type表示每個Scala實例都是唯一的單例類型。

您可以通過Script逆變解決這個問題:

trait Script[-Type <: ScriptType]

使得ScalaScript可以被接受爲亞型Script[Scala.this.type],由於Scala超類型的Scala.this.type(的單型任何Scala的實例)。