为什么我的嵌套伴随对象的成员在类中不会自动显示?

Jea*_*let 8 import scala nested

假设我有这个Scala代码:

object Outer {

  object Inner {
    val B = "B"
  }
  class Inner {
    def b = B
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以编译,但B不能从定义中访问b.我需要添加import Inner._class Inner,使其工作.这是为什么?伴侣对象Inner未正确定义吗?

Agl*_*Agl 11

如果伴随对象的成员将被导入到类中,它将污染类的命名空间,而程序员无法控制它.这可能不是那么糟糕(但仍然很糟糕)的值,但我真的不希望看到与功能.

只考虑一下apply()你从特征中继承的功能(这两种情况都不能只是改变名称而不会丢失某些东西).如果这些函数自动导入到类命名空间中,编译器就不知道要使用哪个函数.因此,如果类和对象有一个函数,func()你最终会this.func()在类代码中编写,以确保调用哪一个.

因此,请将其视为清除命名空间的可能性.您仍然可以通过使用来污染它import Inner._


Vas*_*iuk 6

它不应该以这种方式工作 - 使用import Inner._是一致的行为.


通常,如果要在Java中实现类似于静态成员的行为,则需要伴随对象.Scala方法是将所有静态成员移动到单个对象,这样可以从中访问协同类的私有/受保护成员:

object Outer {

  object Inner {
    def print(inner: Inner) = inner.B // compiles!
  }    
  class Inner {
    private val B = "B"
  }    
}
Run Code Online (Sandbox Code Playgroud)

您可以将伴随对象用作具有私有构造函数的类的工厂:

scala> object Outer {
     |
     |   object Inner {
     |     def newInstance = new Inner()
     |   }
     |   class Inner private() {
     |     private val B = "B"
     |   }
     | }
defined module Outer

scala> Outer.Inner.newInstance
res1: Outer.Inner = Outer$Inner@431693

scala> new Outer.Inner
<console>:7: error: constructor Inner cannot be accessed in object $iw
       new Outer.Inner
       ^
Run Code Online (Sandbox Code Playgroud)