2011-12-23 89 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