gpt4 book ai didi

scala - 理解 Scala 中的 “inferred type arguments do not conform to type parameter bounds” 错误

转载 作者:行者123 更新时间:2023-12-04 11:55:12 26 4
gpt4 key购买 nike

我不明白为什么我得到“推断的类型参数不符合类型参数边界”。
首先,我定义了一个称为 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
}

这个想法是在调用 add 时保留已实现的类型或 remove在 CS01 和 CS02 上。
其次,我想定义可以在每个符合 trait CS 的类上执行的操作。然后,我定义了一个名为 Exec 的特征。 (有两个非常简单的类示例 Exec01Exec02 混合 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这使得执行遵循 trait 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)
^

我不太明白,因为任何混合的类 Executable必须是 T 类型由于 trait Executable[T <: CS[T]] 中的限制,具有混合 CS 特征的约束.那么,为什么 this不符合类型参数绑定(bind) U <: CS[U] ?

最佳答案

如果您明确指定要执行的类型参数,则有效:

def execute(e: Exec): T = e.exec[T](this)

似乎是类型推断的限制。

关于scala - 理解 Scala 中的 “inferred type arguments do not conform to type parameter bounds” 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14278937/

26 4 0