scala – 存在类型或类型参数绑定失败
发布时间:2020-12-16 18:30:29 所属栏目:安全 来源:网络整理
导读:我有一个F-bound型Sys: trait Sys[S : Sys[S]] 以及将其作为类型参数的一些特征: trait Foo[S : Sys[S]] 假设我有一个用Foo调用的方法: def invoke[S : Sys[S]](foo: Foo[S]) = () 假设我有一个模型更新类型,以及一个带有Foo的子类型: sealed trait Upda
|
我有一个F-bound型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,Opened和observe,我该如何修复partial函数.允许向Foo添加值或类型成员. 解决方法
如何将Foo trait的类型参数移动到类型变量:
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)
}
更新: 你是绝对正确的.对于所有新类型替换,您需要为body类型参数定义别名. 输入别名示例: 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) = ()
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
