为什么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)
}
}
答案 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#Door
是cars
,所以不是稳定的标识符。
想象一下代码c
。当然,但这表明你不能依赖于同一辆车的出现。
因此,在您的解决方案中,取决于您的真实代码:
var
成为c.is_door_open({c = new Car; c.door})
而不是c
val
参数声明为d:Car#Door var
依赖于is_door_open
的实例,在课堂外宣布,如果您希望它Door
,请将其放在伴侣Car
中,而不是在Car.Door
object Car
成为class Car
(没有is_door_open
参数)的方法,而不是Car。它可以完全访问封闭的Car(使用Door
,如java中所示,或者使用Door
在Car中为此声明别名