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

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) = ()

(编辑:李大同)

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

    推荐文章
      热点阅读