【发布时间】:2019-10-24 08:50:09
【问题描述】:
// Script A.scala
class A {
private val privateVal = 1
}
object A extends App{
println(new A().privateVal)
}
A.scala 可以毫无问题地编译和运行,因为伴随对象及其类可以访问彼此的私有成员。
$ scalac A.scala
$ scala A
1
为什么相同的代码会显示伴随对象在解释时无法访问其伴随类中的私有 val?
$ scala A.scala
error: value privateVal in class A cannot be accessed in A
【问题讨论】:
-
@SarveshKumarSingh 这是错误的。 “一般来说,类的伴生模块是一个与类同名的对象,定义在相同的作用域和编译单元中。”这就是所有需要的,扩展任何东西都没有问题。 scala-lang.org/files/archive/spec/2.13/…
-
@SarveshKumarSingh 我从未见过这样的要求。您提到的保证和限制是否有任何参考?
-
@AlexeyRomanov 我已经看到很多类似的不可预测性(在模式匹配中很常见)与“花式”伴随对象,只要伴随对象恢复为只是一个对象,它们就会消失。是的,没有提到伴生对象需要简单的任何地方,但您也不会在文档的任何地方找到“花哨”的伴生对象。
-
@SarveshKumarSingh 这真的需要一个“花式”的定义。当然,我认为集合类型的伴生对象比仅仅扩展
App更有趣。 -
@AlexeyRomanov 不是真的...
DelayedInit更高级。无论如何,OP 的问题似乎已经解决,并且与此无关。
标签: scala read-eval-print-loop companion-object