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

c14*_*lie 3 scala class function parent

为什么Scala repl说:

<console>:10: error: type mismatch;  
 found   : Car#Door  
 required: _1.Door where val _1: Car  
Run Code Online (Sandbox Code Playgroud)

当我运行这个声明时:

var c = New Car  
c.is_door_open(c.door)  
Run Code Online (Sandbox Code Playgroud)

这指的是这个类:

class Car {  
    var door = new Door(true)  

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

    def is_door_open(d: Door) {  
         println(d.state)  
    }  
}
Run Code Online (Sandbox Code Playgroud)

Did*_*ont 6

当你有一个内部类时Door,每个类的实例Car定义一个不同的Door类型.在is_door_open(d :)中Door,Door表示Car的封闭实例的Door.错误信息中的Car#Door类型意味着任何车门,它是所有车门的通用类型.

当你调用c.is_door_open(c.door)Carc.door必须是相同的cc.is_door_open,因为这是申报is_door_open要求(这应该是d: Car#Door其他).而且,它们必须与编译器的满意度相同​​,编译器具有一些精确的规则.这里看起来很明显cars是相同的.不是这样,因为c是一个var,所以不是一个稳定的标识符.

想象一下代码c.is_door_open({c = new Car; c.door}).当然,但这表明你不能依赖于同一辆车的出现.

因此,在您的解决方案中,根据您的实际代码可能是:

  1. c一个val而不是一个var
  2. is_door_open参数声明为d:Car#Door
  3. 停止Door依赖于实例Car,在类外声明它,如果你想要它Car.Door,把它放在一个伴侣object Car而不是class Car
  4. 制定is_door_open一个方法Door(不用Door参数)而不是Car.它可以完全访问封闭的Car(Car.this如java中所示,或者在Car中为此声明别名class Car {car =>)