Class Scala:将子类的实例传递给父类函数
为什么Scala repl会说: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
<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
aval
而不是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)
}
}