Scala:将子类的实例传递给父类函数

时间:2011-09-21 20:52:19

标签: class function scala parent

为什么Scala代表说:

<console>:10: error: type mismatch;  
 found   : Car#Door  
 required: _1.Door where val _1: Car  

当我运行此声明时:

var c = New Car  
c.is_door_open(c.door)  

指的是这个类:

class Car {  
    var door = new Door(true)  

    class Door (var state: Boolean = true) {  }    

    def is_door_open(d: Door) {  
         println(d.state)  
    }  
}

1 个答案:

答案 0 :(得分:6)

如果此处的内部类为Door,则类Car的每个实例都会定义不同的Door类型。在is_door_open(d:Door)中,“门”表示封闭的Car实例的“门”。错误信息中的Car#Door类型意味着任何车门,它是所有车门的通用类型。

当您致电c.is_door_open(c.door)时,Car的{​​{1}}必须与c.door的{​​{1}}相同,因为这就是c的声明{1}}要求(否则应为c.is_door_open)。而且,它们必须与编译器的满意度相同​​,编译器具有一些精确的规则。这似乎显而易见is_door_open是相同的。不是这样,因为d: Car#Doorcars,所以不是稳定的标识符。

想象一下代码c。当然,但这表明你不能依赖于同一辆车的出现。

因此,在您的解决方案中,取决于您的真实代码:

  1. var成为c.is_door_open({c = new Car; c.door})而不是c
  2. val参数声明为d:Car#Door
  3. 停止将var依赖于is_door_open的实例,在课堂外宣布,如果您希望它Door,请将其放在伴侣Car中,而不是在Car.Door
  4. 使object Car成为class Car(没有is_door_open参数)的方法,而不是Car。它可以完全访问封闭的Car(使用Door,如java中所示,或者使用Door在Car中为此声明别名