2013-05-11 72 views
2

在下列情況下斯卡拉似乎不承認的system類型:如果我不能完全糊塗模式匹配拒絕承認成員類型(X值不_2的成員)

sealed trait Bar[S] { 
    def system: S 
} 

trait Foo { def bar(): Unit } 

trait FooBar extends Bar[Foo] 

,這意味着,我應該能夠做到以下幾點:

def test(fb: FooBar) { fb.system.bar() } // ok, this works 

但下列失敗:

trait Test[S] { 
    val bar: Bar[S] 

    bar match { 
    case fb: FooBar => fb.system.bar() // error: value bar is not a member of _2 
    case _ => 
    } 
} 

這是一個模式匹配器中的錯誤,還是我錯過了一個關鍵位?


編輯:請注意,下面的工作:

trait Test[S] { 
    val bar: Bar[S] 

    bar match { 
    case fb: FooBar => (fb: FooBar).system.bar() 
    case _ => 
    } 
} 

我想我應該提交一個bug?

回答

0

類型擦除是絕對涉及到這裏,但我不是100%確定你所看到的是一個錯誤或預期的行爲。由於您將bar val聲明爲Bar[S],因此S被清除,並且模式匹配器沒有要使用的基礎類型。你可以通過改變你的比賽看擦除警告:

case fb:Bar[Foo] => 

奇怪的是,如果你宣佈barAny型原來的比賽將正常工作。另外,如果你在比賽的語句將鼠標懸停在fb,你可以看到它被視爲:

Bar[S] with FooBar 

同樣,我相信這一切又回到bar是如何被聲明。不知道這是一個錯誤,但我想象一個在模式匹配器內部工作經驗更豐富的人可能會有更深入的解釋。

+0

'FooBar'是一個平面類型,所以擦除沒有問題。另請注意,編譯器接受我的類型註釋'(fb:FooBar)',所以匹配大小寫的類型肯定有些奇怪。 – 2013-05-11 22:16:28