1

当使用从一种 f 有界类型到另一种类型的投影时,我遇到了一个我不理解的类型错误。这可能与较早的问题有关,但我不确定。

设置很简单:

trait Foo[F <: Foo[F]] {
  type I <: Foo[I]
}

也就是说,我有一个F包含到另一个类似系统的投影的系统。

好的,现在我需要做的是,给定F,能够使用F#I. 但是编译器抱怨:

trait Test {
  def apply[F <: Foo[F]]: Unit = bar[F#I]   // type error
  def bar  [F <: Foo[F]]: Unit = ???
}

<console>:52: error: type arguments [F#I] do not conform to method bar's 
  type parameter bounds [F <: Foo[F]]
             def apply[F <: Foo[F]]: Unit = bar[F#I]
                                               ^

那么这是为什么呢?有没有解决办法?


实际上,它似乎是这个问题的一个变体,它没有解释发生了什么。


编辑:例如,以下编译:

trait Test {
  def apply[F <: Foo[F] { type I = I1 }, I1 <: Foo[I1]]: Unit = bar[I1]
  def bar  [F <: Foo[F]]: Unit = ???
}

现在的问题是,那个糟糕的类型参数I1会在我的 API 中通过几十个级别冒泡,所以我真的需要找到一个避免第二个类型参数的解决方案。

4

1 回答 1

0

好的,所以我浏览了我现有的代码库,直到我发现以前使用过这个解决方法:

trait Foo[F <: Foo[F]] {
  type I  <: Foo[I]
  type Tx <: Txn[F]
}

trait Txn[F <: Foo[F]] {
  val foo: F
}

trait Test {
  def apply[F <: Foo[F]](implicit tx: F#Tx): Unit = {
    val foo: F = tx.foo
    bar[F, foo.I](tx)
  }

  def bar[F <: Foo[F], I <: Foo[I]](implicit tx: F#Tx): Unit = ???
}

也就是说,我需要有一个,我可以从中得到一个依赖于路径的类型,然后打字机又高兴了。

我仍然很想了解为什么我的原始代码被拒绝。

于 2014-07-07T21:47:40.250 回答