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) = () (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |