【问题标题】:Scala: Passing instance of child class to parent class functionScala:将子类的实例传递给父类函数
【发布时间】:2011-09-21 20:52:19
【问题描述】:

为什么 Scala repl 说:

<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)  
    }  
}

【问题讨论】:

  • 哪个 Scala 版本?在 2.7.7final 上工作(在删除 = true 默认值后)...
  • Scala 版本为 2.9.0.1
  • @Tomasz :我怀疑出于(好)习惯,您声明了 val c 而不是 var c

标签: class function scala parent


【解决方案1】:

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

当您调用c.is_door_open(c.door) 时,c.doorCar 必须与c.is_door_openc 相同,因为这是is_door_open 的声明所要求的(应该是@987654331 @ 除此以外)。而且,它们必须相同才能让编译器满意,编译器对此有一些精确的规则。在这里,cars 似乎很明显是相同的。不是这样,因为cvar,所以不是一个稳定的标识符。

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

所以在你的解决方案中,取决于你的真实代码可能是什么:

  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(在 java 中使用 Car.this,或者在 Car 中使用 class Car {car =&gt; 声明它的别名)

【讨论】:

  • 感谢您的帮助。现在我明白了 Scala 使用 # 符号时的含义。
猜你喜欢
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多