2012-03-15 72 views
2

我如何能延長我有我使用的是使用了鴨子類型類型:型的特點在斯卡拉

type t={ 
    def x:Int 
... 
} 
class t2 { 
def x:Int=1 
} 
def myt:t=new t2 //ducktyping 

我想寫被迫接口類型特徵,但這並不工作:

trait c extends t { //interface DOES NOT COMPILE 
    def x:Int=1 
} 

在另一方面:如果我寫的性狀T1,而不是類型T的話,我失去了鴨子類型特點:

trait t1 { 
def x:Int 
} 
type t=t1 
trait c extends t1 { // t1 can be used as interface 
    def x:Int=1 
} 
def myt:t=new t2 // DOES NOT COMPILE since t1 is expected 

那麼我如何使用ducktyping和接口?

回答

4

您只能在Scala(即類,特徵,Java接口)中擴展類類實體(通常不是類型)(即結構類型,類型參數或成員)。不過,你可以自己類型到所有這些。這意味着我們可以重寫非編譯trait c如下,

trait c { self : t => 
    def x : Int = 1 
} 

c身體this類型是目前已知是t,即,已知符合結構類型{ def x : Int },和只有將c混合到實際符合該結構類型的類中(或者通過直接實現簽名,或者如果抽象地通過重新確定自我類型並將義務傳播到最終的具體類),

type t = { def x : Int } 

trait c { self : t => } 

class t2 extends c { // OK, t2 conforms to t 
    def x : Int = 1 
} 

def myt : t = new t2 // OK, as before 

class t3 extends c { // Error: t3 doesn't conform to c's self-type 
    def y : String = "foo" 
} 
+0

謝謝,看起來goo d。 – user1271572 2012-03-15 16:46:43