2014-06-08 186 views
3

說我有一個類中的性狀以下簡單的斯卡拉定義中:斯卡拉 - 走樣類型的類型

class Foo { 
    trait Bar 
} 

val f = new Foo 
type MyAlias = f.Bar 

這讓我別名BarMyAlias。但是,如果我試圖內聯讀取type MyAlias = (new Foo).Bar編譯抱怨。它爲什麼會抱怨,並有一種方法可以實現這一點?

+1

請參閱解釋一下:http://stackoverflow.com/a/12959947/384442 – RomanI

回答

4

具有Scala中的類型的.運算符用於路徑相關類型。例如,您的f.BarBar的一個實例,它以f作爲其父項。編譯器禁止(new Foo).Bar,因爲它不是一個有用的表達式 - 你扔掉唯一的Foo可以用來創建該類型的實例,所以沒有值能夠滿足該別名。你可能想要的是Foo#Bar。這不是一個路徑依賴類型。任何Bar,無論與Foo相關聯,都是Foo#Bar

下面是一個例子:

class Foo { 
    class Bar 
} 

val f1 = new Foo 
val f2 = new Foo 
val b1 = new f1.Bar 
val b2 = new f2.Bar 

// This won't compile, because b2 is a f2.Bar, not an f1.Bar 
// val pathDependentBar: f1.Bar = b2 

val FooHashBar: Foo#Bar = b1