scala类型和继承误解

时间:2010-09-21 04:13:47

标签: 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)        
    }           
}

我有:value id不是类型参数C1的成员 为什么呢?

2 个答案:

答案 0 :(得分:6)

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

您可能想写的是class C3 extends C2[C1](即您将C1类作为C2的类型参数传递)。

答案 1 :(得分: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中运行)。