作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为一个可以被覆盖的类实现一个泛型隐式。如下:
tooling.scala
package tooling
case class Tool( msg: String)
class Toolkit{
def usingTool(source:String)(implicit tool:Tool){
println( s"[$source] using tool: ${tool.msg}" )
}
}
user.scala
package user
class User{
val toolkit = new Toolkit()
def usingGenericTool(){
toolkit.usingTool( "from generic usage")
}
def usingSpecificTool(){
implicit lazy val tool = Tool("shovel")
toolkit.usingTool( "from generic usage")
}
}
如果我在伴随对象或特征中定义通用隐式 Tool
实现,我会收到警告,tool 和通用隐式是模糊隐式值
.
如何定义一个通用的隐式 val,它仍然可以在方法范围内被覆盖并在各种类中重用?
最佳答案
在Tool
的伴随对象中定义默认隐式:
case class Tool( msg: String)
object Tool {
implicit val defaultTool: Tool = Tool("Generic")
}
您可以通过导入其他工具或创建隐式 Tool
变量来覆盖它:
object Tools {
implicit val Special: Tool = Tool("special")
}
def usingTools(): Unit = {
val toolkit = new Toolkit()
toolkit.usingTool("using the default")
{ // importing an override
import Tools.Special
toolkit.usingTool("using imported")
}
{ // creating an override
implicit val anotherTool: Tool = Tool("local")
toolkit.usingTool("using local implicit val")
// using a Tool other then the currently imported as an exception:
toolkit.usingTool("overriding once manually")(Tool("manual"))
}
}
关于scala - 构造一个可重写的隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36518538/
我是一名优秀的程序员,十分优秀!