2012-01-29 39 views
2

我試圖使用Scala 2.10.0-M1如下:類型等效問題

def bar[C <: Container](c: C)(x: C#X): c.X = x 
:使用這種形式時

trait Container { 
    type X 
} 

class Test[C <: Container](val c: C) { 
    def foo(x: c.X): C#X = x // this compiles fine 
    def bar(x: C#X): c.X = x // this does not compile 
} 

的問題是相同的

我真的不明白爲什麼foo編譯,而bar沒有。

我認爲c.XC#X這裏應該是一樣的。

另外,我不明白的錯誤消息:

[error] found : x.type (with underlying type C#X) 
[error] required: Test.this.c.X 
[error] possible cause: missing arguments for method or constructor 
[error] def bar(x: C#X): c.X = x // this does not compile 

任何想法?

+0

這是一個通常是一個設計問題,我想從路徑依賴類型中檢索類型。我爲此創建了[另一個問題](http://stackoverflow.com/questions/9065343/exposing-a-path-dependent-type-coming-from-a-singleton-type)。 – betehess 2012-01-30 14:29:18

回答

7

C#X表示來自任何CXc.X表示來自您的特定CX,即c。後者更具體!

例如,如果X是紙幣和c是一個特定客戶,c.X意味着該方法只接受的紙幣(爲,大概)客戶cC#X表示它接受來自任何客戶的任何賬單。如果你想確保客戶只需要自己的賬單(至少默認),前者是你想要的。

2

c.X and C#X絕對不一樣 - 如果是的話,爲什麼都存在?

請考慮您有abC的不同實例的情況。根據定義,a.Xb.X是不同的,但都是C#X

3

@Rex給出了一個很好的解釋。下面是如果它是合理的,能夠返回xc.X類型的結果,你會如何解決這個問題?

(即在X類型作爲參數傳遞的特定c的值,那麼你可以收緊它的類型作爲參數,

def bar[C <: Container](c: C)(x: c.X): c.X = x 

現在酒吧僅接受是相對於特定值cX類型的值。如果不適合你在酒吧的調用點工作,那麼你將需要重新設計你的設計