1

确实是一件很奇怪的事情。我有以下项目结构:

myproject/one/two

在包里面myproject我有一个类:

abstract class A (two: Buffer[Int])

然后,在包裹内one我有:

object B extends A (Buffer[Int](1, 2, 3)) {

  val с = two.map(_ + 1)  // ERROR

}

但是,错误说:

对象map不是包的成员 myproject/one/two

这显然是错误的,因为应该非常清楚我在这里不是指包,而是指局部变量......并且two在 in 之后也没有在 context-assistthis.B显示,但在A(Scala-IDE)中显示. 这是一种预期的行为,我做错了什么还是一个错误?

更新:

(同时由 Nicolas 建议:D)能够通过指定twoval(将其公开)来解决名称冲突。起初我没有注意到,但它是私有的,在后继类中不可用。尽管如此,我仍然想知道,Scala 为什么以及如何拿起一个包而不是说该变量不存在或不可访问?

4

1 回答 1

3

它并不像你想象的那么清楚。如果没有修饰符,则 two 对于抽象类 A class 是私有的A。因此,您的声明a等同于abstract class A (private[this] A). 这意味着two从 object 看不到该字段B。一个直接的结果是编译器查看two可见的唯一定义B:包two

于 2012-07-04T10:52:13.990 回答