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

Class Scala:将子类的实例传递给父类函数,class,function,scala,parent,Class,Function,Scala,Parent,为什么Scala repl会说: <console>:10: error: type mismatch; found : Car#Door required: _1.Door where val _1: Car 指的是这个类: class Car { var door = new Door(true) class Door (var state: Boolean = true) { } def is_door_ope

为什么Scala repl会说:

<console>:10: error: type mismatch;  
 found   : Car#Door  
 required: _1.Door where val _1: Car  
指的是这个类:

class Car {  
    var door = new Door(true)  

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

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

当您有一个内部类作为
Door
时,类
Car
的每个实例定义了不同的
Door
类型。在is_door_open(d:
)中,门是指汽车封闭实例的门。错误消息中的轿厢门类型表示任何轿厢的门,它是所有门的通用类型

当你呼叫
c.is\u door\u open(c.door)
c.door的
Car
必须与
c.is\u door\u open
c
相同,因为这是
is\u door\u open
声明所要求的(否则应该是
d:Car\code>)。而且,它们必须是相同的,以使编译器满意,编译器对此有一些精确的规则。显然,这里的
汽车
是相同的。不是这样,因为
c
是一个
var
,所以不是一个稳定的标识符

想象一下代码
c.门开着({c=newcar;c.door})
。当然是人为的,但这表明你不能相信c是同一辆车

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

  • 使
    c
    a
    val
    而不是
    var
  • 车门是否打开
    参数声明为d:车门
  • 停止根据
    汽车的实例制作
    ,如果你想让它成为
    汽车,就在课外声明它。门
    ,把它放在一辆同伴
    目标汽车
    里,而不是
    类别汽车
  • Make
    是车门打开的方法,而不是汽车。它可以完全访问封闭的汽车(使用
    Car.this
    与java中一样,或者使用
    class Car{Car=>
    为汽车声明别名)

  • 哪个Scala版本?在2.7.7最终版上有效(删除
    =true
    默认值后)…Scala版本是2.9.0。1@Tomasz:我怀疑是出于(好)习惯,您声明了val c而不是var c感谢您的帮助。现在我明白了Scala使用#符号的含义。
    class Car {  
        var door = new Door(true)  
    
        class Door (var state: Boolean = true) {  }    
    
        def is_door_open(d: Door) {  
             println(d.state)  
        }  
    }