gpt4 book ai didi

scala - 存在类型或类型参数绑定(bind)失败

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

我有一个 F 有界类型 Sys :

trait Sys[S <: Sys[S]]

还有一些将其作为类型参数的特征:
trait Foo[S <: Sys[S]]

假设我有一个使用 Foo 调用的方法:
def invoke[S <: Sys[S]](foo: Foo[S]) = ()

假设我有一个模型更新类型和一个带有 Foo 的子类型:
sealed trait Update
case class Opened[S <: Sys[S]](foo: Foo[S]) extends Update

注册模型观察者的辅助函数:
def observe(pf: PartialFunction[Update, Unit]) = ()

现在以下失败:
observe {
case Opened(foo) => invoke(foo)
}


<console>:16: error: inferred type arguments [Any] do not conform to method invoke's
type parameter bounds [S <: Sys[S]]
case Opened(foo) => invoke(foo)
^

如何修复部分函数 , 如果 Sys , Foo , invoke , Update , Openedobserve给出。允许向 Foo 添加值或类型成员.

最佳答案

的移动类型参数怎么样?富 类型变量的特征:

trait Sys[S <: Sys[S]]
trait Foo { type S <: Sys[S] }

sealed trait Update
case class Opened(foo: Foo) extends Update

def invoke(foo: Foo) = ()
def observe(pf: PartialFunction[Update, Unit]) = ()

observe {
case Opened(foo) => invoke(foo)
}

更新:

你是绝对正确的。对于所有新类型替换,您需要为将类型参数移动到正文定义别名。

键入别名示例:
trait Sys[S <: Sys[S]]
class A extends Sys[A]
class B extends Sys[B]

trait Foo { type S <: Sys[S] }
trait Boo { type S <: Sys[S] }

object module_A{
type Foo = com.company.Foo { type S <: A }
type Boo = com.company.Boo { type S <: A }
}

def invoke(foo: module_A.Foo, boo: module_A.Boo) = ()

关于scala - 存在类型或类型参数绑定(bind)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20982681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com