2011-12-23 84 views
4

爲了避免在對參數化類進行子類化時重複類型參數信息,我試圖重寫一些代碼以使用抽象類型。與抽象類型交換類型參數

我想什麼來表達類似:

class Group[A] 

abstract class Thing[A, G <: Group[A]] { 
    val group: G 
} 

class SomeGroup[A] extends Group[A] { g =>  
    object SomeThing extends Thing[A, SomeGroup[A]] { 
    val group = g 
    } 
} 

使用抽象類型,我的最好的嘗試,到目前爲止是:

class Group { 
    type A 
} 

abstract class Thing { t => 
    type A 
    type G <: Group { type A = t.A } 
    val group: G 
} 

class SomeGroup extends Group { g => 
    object SomeThing extends Thing { 
    type A = g.A 
    type G = SomeGroup { type A = g.A } 
    val group = g 
    } 
} 

但是,我得到一個編譯器錯誤最後一行說「價值組具有不兼容的類型」。

如何使用抽象類型編寫第一個示例?

回答

3

你需要給類型檢查/推斷器一點幫助:

val group : G = g 

使得它去。

+0

這比我想象的要簡單。 :)爲什麼這裏有必要的任何好理由? – 2011-12-23 19:10:03

+1

我會想象沒有任何幫助,類型檢查器會將'g'的類型看作「SomeGroup」,除非使用類型註釋,否則這就是分配給'group'的類型。儘管如此,不要聽我的話。 – Philippe 2011-12-23 19:14:45