加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

理解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上调用添加或删除时保持实现的类型.
其次,我想定义可以在每个符合特征CS的类上执行的操作.然后,我定义了一个名为Exec的特性(有两个非常简单的类Exec01和Exec02混合使用Exec特性的例子):

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)

似乎是类型推断的限制.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读