2015-10-29 109 views
3

定義類型我怎樣才能解決這個代碼:斯卡拉從多個通用特質

trait A[A,B]{ 
    def f(a:A):B 
} 
trait B[A,B]{ 
    def g(a:A):B 
} 

type C = A[String,Int] with B[String,Double] 

//works fine 
new A[String,Int] with B[String,Double] { 
    def f(a:String):Int = 1 
    def g(a:String):Double = 2.0 
} 

//error 
new C { 
    def f(a:String):Int = 1 
    def g(a:String):Double = 2.0 
} 

我得到的例外是:

Error:(41, 6) class type required but A$A42.this.A[String,Int] with A$A42.this.B[String,Double] found 
new C { 
    ^

不知道如何解決,什麼是其中的原因?

+0

最簡單的解決方案將是,以限定'C'作爲性狀而不是一個類型別名:'性狀Ç延伸的[字符串,INT]與B [字符串,雙]'。 –

+0

我知道我可以做到這一點。但我對它爲什麼會感興趣 –

+2

這裏的通用部分是紅色的鯡魚,你會看到'特質A'和'特質B'的相同結果。 –

回答

2

我猜爲什麼它不起作用(也可能不應該):type C = ...定義了一些不是類類型的東西,我不知道它是什麼。但是,當您將其傳遞到new時,它預計爲new class_type with trait_type ...,因此您只想替換一件東西,即class_typeC。如果你定義C沒有with它將工作。

還可以寫爲:

type C1 = A[String,Int] 
type C2 = B[String,Double] 
new C1 with C2 { 
    def f(a:String):Int = 1 
    def g(a:String):Double = 2.0 
}