scala - Scala - 为什么不能使用对象的特征
问题描述
我创建了一个包含本地特征的单例对象的简单应用程序:
object Singleton {
trait FirstTrait {
val func1 = (i: Int) => i * 2
}
trait SecondTrait {
val func2 = (s: String) => s
}
trait ThirdTrait {
val func3 = () => println("Func 3")
}
}
现在,Main
实际上,我想做这样的事情:
object Main extends App {
val singleton = Singleton.FirstTrait//cannot do this
}
但我不能这样做(编译错误)。为什么?为什么我无法访问这个本地特征?如果我将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)
}
}
Main
运行良好并且程序可以编译。但是我从 中调用另一个单例对象Singleton
,而不是特征。我知道trait
不能实例化,但我认为这不是解决方案,因为我还有一个简单的ScalaTest
测试名称,看起来像
"Singleton" should "test it" in Singleton.FirstTrait{...}
在这里我可以访问FirstTrait
. 那么为什么我不能在普通代码中使用它呢?我不能很好地理解它。也许我是个白痴,但如果有人能很好地向我解释,我会很感激的。
解决方案
这是一个trait
所以你需要正确地“实例化”它:
val singleton = new Singleton.FirstTrait {}
// singleton: Singleton.FirstTrait = $anon$1@5e97da56
请注意,从技术上讲, atrait
无法实例化。上面的表达式是扩展特征的匿名类的实例。
推荐阅读
- flutter - Flutter 无限滚动 - 滚动监听器触发器
- reactjs - 更新了 npm 依赖,现在它不会编译
- c++ - 无法将 DefineClass (JNI) 与 Qt 资源一起使用
- operating-system - 如何构建一个从 4000 多个嵌入式设备获取 GPS 数据并实时处理的系统
- php - 根据相同的键值连接值
- java - JBeret 和 JSR352,关于重启和持久数据的一些说明
- time-series - R中每月降雨栅格的像素标准化降水指数(SPI)计算
- java - 为什么 TabLayout 总是搞乱标签顺序?
- jsf - 使用 Omnifaces 在 JSF 中处理 Ajax 请求的异常:始终显示状态代码 200 而不是 500
- blender - 文本渲染有点嘈杂,即使是 200 个样本