由`this.type`

时间:2017-06-02 19:45:44

标签: scala types

我正在尝试创建ScriptScriptType类。 ScriptType将产生特定抽象类型的ScriptScript将由创建它们的ScritpType参数化。

我的第一次尝试看起来像这样:

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 S

中分配ScriptType.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]

1 个答案:

答案 0 :(得分:2)

ScalaScript不是Script[Scala.this.type],因为this.type表示对每个Scala实例唯一的单例类型。

你可以通过Script逆变来解决这个问题:

trait Script[-Type <: ScriptType]

这样ScalaScript可以作为<{1}}的子类型被接受,因为Script[Scala.this.type]是{{1>}的超类型Scala)的任何实例的单例类型。