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)
当你有一个内部类时Door
,每个类的实例Car
定义一个不同的Door
类型.在is_door_open(d :)中Door
,Door表示Car的封闭实例的Door.错误信息中的Car#Door类型意味着任何车门,它是所有车门的通用类型.
当你调用c.is_door_open(c.door)
了Car
的c.door
必须是相同的c
的c.is_door_open
,因为这是申报is_door_open
要求(这应该是d: Car#Door
其他).而且,它们必须与编译器的满意度相同,编译器具有一些精确的规则.这里看起来很明显cars
是相同的.不是这样,因为c
是一个var
,所以不是一个稳定的标识符.
想象一下代码c.is_door_open({c = new Car; c.door})
.当然,但这表明你不能依赖于同一辆车的出现.
因此,在您的解决方案中,根据您的实际代码可能是:
c
一个val
而不是一个var
is_door_open
参数声明为d:Car#DoorDoor
依赖于实例Car
,在类外声明它,如果你想要它Car.Door
,把它放在一个伴侣object Car
而不是class Car
is_door_open
一个方法Door
(不用Door
参数)而不是Car.它可以完全访问封闭的Car(Car.this
如java中所示,或者在Car中为此声明别名class Car {car =>
)