我正在尝试创建Script
和ScriptType
类。 ScriptType
将产生特定抽象类型的Script
。 Script
将由创建它们的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]
?
答案 0 :(得分:2)
ScalaScript
不是Script[Scala.this.type]
,因为this.type
表示对每个Scala
实例唯一的单例类型。
你可以通过Script
逆变来解决这个问题:
trait Script[-Type <: ScriptType]
这样ScalaScript
可以作为<{1}}的子类型被接受,因为Script[Scala.this.type]
是{{1>}的超类型 (Scala
)的任何实例的单例类型。