我用singleton对象创建了一个包含本地特征的简单应用程序:
object Singleton {
trait FirstTrait {
val func1 = (i: Int) => i * 2
}
trait SecondTrait {
val func2 = (s: String) => s
}
trait ThirdTrait {
val func3 = () => println("Func 3")
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在Main对象中,我想做这样的事情:
object Main extends App {
val singleton = Singleton.FirstTrait//cannot do this
}
Run Code Online (Sandbox Code Playgroud)
但我不能这样做(编译错误).为什么?为什么我无法访问这个本地特征?如果我将Singleton对象更改为:
object Singleton {
trait FirstTrait {
val func1 = (i: Int) => i * 2
}
trait SecondTrait {
val func2 = (s: String) => s
}
trait ThirdTrait {
val func3 = () => println("Func 3")
}
object FirstObject extends FirstTrait {
println(func1)
}
}
Run Code Online (Sandbox Code Playgroud)
Main运作良好,程序编译.但是我从另一个单身对象中调用了另一个单例对象Singleton.我明白trait不能实例化,但我认为它不是一个解决方案,因为我还有一个简单的ScalaTest测试名称,看起来像
"Singleton" should "test it" in Singleton.FirstTrait{...}
Run Code Online (Sandbox Code Playgroud)
在这里我可以访问FirstTrait.那么为什么我不能在普通代码中使用它呢?我不能理解它.也许我是个白痴,但如果有人能够很好地向我解释,我会很高兴.
这是一个trait你需要正确"实例化"它:
val singleton = new Singleton.FirstTrait {}
// singleton: Singleton.FirstTrait = $anon$1@5e97da56
Run Code Online (Sandbox Code Playgroud)
请注意,技术上trait无法实例化.上面的表达式是扩展特征的匿名类的实例化.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |