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

scala – 为证据参数交换类型参数的上限

发布时间:2020-12-16 18:54:34 所属栏目:安全 来源:网络整理
导读:我想放宽对特征类型参数的约束,而是将它们以证据参数的形式强加给方法.鉴于一些骨架设置: trait State[Repr]object Observer { def apply[Repr : State[Repr]](reader: Reader[Repr]): Observer[Repr] = new Observer[Repr] {}}trait Observer[A]trait Read
我想放宽对特征类型参数的约束,而是将它们以证据参数的形式强加给方法.鉴于一些骨架设置:

trait State[Repr]
object Observer {
  def apply[Repr <: State[Repr]](reader: Reader[Repr]): Observer[Repr] = 
    new Observer[Repr] {}
}
trait Observer[A]
trait Reader  [A]

这有效:

trait StateX[Repr <: StateX[Repr]] extends State[Repr] { 
  protected def reader: Reader[Repr]
  def observe: Observer[Repr] = Observer(reader)
}

而这不是:

trait StateY[Repr] extends State[Repr] { 
  protected def reader: Reader[Repr]
  def observe(implicit ev: Repr <:< State[Repr]): Observer[Repr] = Observer(reader)
}

消息“推断类型参数[Repr]不符合方法apply的类型参数bounds [Repr&lt ;:State [Repr]]”.由于证据表明这种构象,我想知道如何修复StateY.

解决方法

你的问题是即使形式A<:<的证据也是如此. B意味着类型A的值可以转换为类型B的值,它并不意味着A<:B ...实际上,使用类型约束或视图绑定而不是普通类型绑定的主要原因正是因为这种子类型关系不成立. 因此,StateY中的约束,Repr<:< State [Repr]不足以满足Observer的apply方法中绑定的Repr<:State [Repr].假设您想要放宽对StateX类型参数的约束,您唯一的选择是相应地削弱apply方法的类型参数的约束.使用视图绑定而不是普通类型绑定,可以获得类似下面的内容,

object Observer {
  def apply[Repr <% State[Repr]](reader : Reader[Repr]) : Observer[Repr] =
    new Observer[Repr] {}
}

或者,

object Observer {
  def apply[Repr](reader : Reader[Repr])
                 (implicit ev : Repr <:< State[Repr]) : Observer[Repr] =
    new Observer[Repr] {}
}

如果你宁愿在整个过程中使用约束.

(编辑:李大同)

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

    推荐文章
      热点阅读