2014-07-07 87 views
1

當我使用從一個f-bound類型到另一個f-bound類型的投影時,我得到一個我不明白的類型錯誤。這可能是related to an earlier question,但我不確定。不能使用類型投影到遞歸(f-bound)類型

的設置很簡單:

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] 
              ^

那麼,爲什麼這樣呢?有沒有解決方案?


其實,這似乎是一個this problem變體,其沒有解釋是怎麼回事。


編輯:例如,下面的編譯:

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

現在的問題是,低劣的類型參數I1會冒泡通過幾十個在我的API級別的,所以我真的很需要找到避免第二個類型參數的解決方案。

回答

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 = ??? 
} 

也就是說,我需要有一個從中我得到一個路徑 - 依賴型,然後typer再次開心。

我仍然很想知道爲什麼我的原始代碼被拒絕。