2010-09-21 74 views
3

你能解释一下这个微不足道的例子吗?scala类型和遗传误解

class C1 (val id: Int) 

abstract class C2 [T] { 
    def m1 [T] 
} 

class C3 [C1] extends C2 
{ 
    override 
    def m1 (obj: C1) { 
     println (obj.id)   
    }   
} 

我有:值id不是类型参数C1 为什么的一员?

回答

4

在你的例子中有几件事情在玩。这里是修改的例子:

class C1 (val id: Int) 

abstract class C2 [T] { 
    // don't repeat [T] and the method takes an arg 
    // within C2, T refers to the type parameter 
    def m1(t:T) 
} 

class C3 extends C2[C1] { // if in REPL put the brace on the same line 
    // no override when implementing abstract 
    def m1(obj:C1) { println(obj.id) } 
} 

这应该编译(并在REPL中运行)。

+0

谢谢。 这正是我想要的:) – kolchanov 2010-09-21 06:42:06

6

通过编写class C3[C1]您的意思是说C3采用了一个类型参数C1。因此在C3的类定义中,类名C1引用该类型参数,而不是类C1

你可能要写的是class C3 extends C2[C1](即你正在传递类C1作为C2的类型参数)。

+0

谢谢你的建议。 我重写C3至 类C3延伸C2 [C1] { 倍率 DEF M1 [C1](OBJ:C1){ \t \t \t \t的println(obj.id) } } 但我仍然有相同的错误。 – kolchanov 2010-09-21 06:08:12

+0

@kolchanov这是因为你做了同样的事情。如果你写了'def m1 [C1]',那么你就会说'C1'是一个类型参数 - 一些任意类型的参数将在use-site提供 - 这将会影响实际的'C1'类型。 – 2010-09-21 12:58:18