【问题标题】:How to avoid losing type bounds during type projection如何避免在类型投影期间丢失类型边界
【发布时间】:2017-10-25 21:05:30
【问题描述】:

我在编写可以从其发起者那里获取和传递抽象类型成员的代理时遇到问题。

trait Holder[A[_]] {
  type I
  type Y <: A[I]
}

trait Proxy[A[_], H <: Holder[A]] extends Holder[A] {
  override type I = H#I
  override type Y = H#Y
}

我得到了错误:

error: overriding type Y in trait Holder with bounds <: A[Proxy.this.I];
 type Y has incompatible type
  override type Y = H#Y
                ^
one error found

这是一个基本的 scala 限制,还是可以以某种方式规避?

【问题讨论】:

  • 我想你的意思是override type Y = A[I]
  • 不。我想将类型从发起者对象传递给代理。所以我可以使用根据发起者类型定义的方法

标签: scala type-projection


【解决方案1】:

您对Holder 的定义意味着对于特定对象h: Holder[A],您拥有h.Y &lt;: A[h.I]

但这并不意味着每个H &lt;: Holder[A] 都有H#Y &lt;: A[H#I]。我认为如果A 是协变的(因为你有h.Y &lt;: A[h.I] &lt;: A[H#I],所以所有h.Y 的共同超类型是&lt;: A[H#I])。

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 2020-10-28
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多