理解Scala中的“推断类型参数不符合类型参数边界”错误
发布时间:2020-12-16 19:16:52 所属栏目:安全 来源:网络整理
导读:我无法理解为什么我得到“推断类型参数不符合类型参数边界”. 首先,我定义了一个称为CS的特征,它可以由几个类(例如,CS01和CS02)实现: trait CS[+T : CS[T]] { this: T = def add: T def remove: T}class CS01 extends CS[CS01] { def add: CS01 = new CS01
我无法理解为什么我得到“推断类型参数不符合类型参数边界”.
首先,我定义了一个称为CS的特征,它可以由几个类(例如,CS01和CS02)实现: trait CS[+T <: CS[T]] { this: T => def add: T def remove: T } class CS01 extends CS[CS01] { def add: CS01 = new CS01 def remove: CS01 = new CS01 } class CS02 extends CS[CS02] { def add: CS02 = new CS02 def remove: CS02 = new CS02 } 想法是在CS01和CS02上调用添加或删除时保持实现的类型. trait Exec { def exec[U <: CS[U]](x: U): U } class Exec01 extends Exec { def exec[U <: CS[U]](x: U): U = x.add } class Exec02 extends Exec { def exec[U <: CS[U]](x: U): U = x.remove } 再次,我需要保持混合CS特征的类的实现类型.这就是为什么exec用[U<:CS [U]]进行参数化的原因. 最后,我希望在它上面的任何CS启用操作混合特征Executable,这使得可以执行跟随特征Exec的操作: trait Executable[T <: CS[T]] { this: T => def execute(e: Exec): T = e.exec(this) } 但是,当我尝试编译时,我收到以下错误: error: inferred type arguments [this.Executable[T] with T] do not conform to method exec's type parameter bounds [U <: this.CS[U]] def execute(e: Exec): T = e.exec(this) ^ 我不太明白,因为任何混合了可执行文件的类必须是类型为T,并且由于特征可执行文件[T<:CS [T]]中的约束而具有混合CS特征的约束.那么,为什么这不符合绑定U<:CS [U]的类型参数? 解决方法
如果您明确指定exec的类型参数,则有效:
def execute(e: Exec): T = e.exec[T](this) 似乎是类型推断的限制. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容