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._
它不应该以这种方式工作 - 使用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)
归档时间: |
|
查看次数: |
1527 次 |
最近记录: |