采取这个代码:
class Register(var value:Int = 0) {
def getZeroFlag() : Boolean = (value & 0x80) != 0
}
object Register {
implicit def reg2int(r:Register):Int = r.value
implicit def bool2int(b:Boolean):Int = if (b) 1 else 0
}
我想像这样使用它:
val x = register.getZeroFlag + 10
但我受到的欢迎是:
type mismatch; found : Boolean required: Int
发生什么?我是否需要定义一个隐式获取返回布尔值的函数?
这是一个演示如何使用隐式的示例:
object Test {
val register = new Register(42)
val x = 1 + register // implicitly calling reg2int from companion object
val y = register - 1 // same
// val z = register + 1 // doesn't work because "+" means string concatenation
// need to bring bool2int implicit into scope before it can be used
import Register._
val w = register.getZeroFlag() + 2 // this works now
val z2 = register + 1 // works because in-scope implicits have higher priority
}
这里有两个可能不明显的事情:
- 当寻求与类型对象之间的隐式转换时
Register
,编译器将查找伴生对象Register
。这就是为什么我们不需要带reg2int
明确地纳入定义范围x
and y
。然而,转换bool2int
确实需要在范围内,因为它没有定义Boolean
or Int
伴生对象。
- 方法
+
已在所有对象上定义为通过隐式进行字符串连接any2stringadd
in scala.Predef
。定义val z
是非法的,因为隐式的字符串连接优先于reg2int
(在伴生对象中发现的隐式优先级相对较低)。然而,定义val z2
有效,因为我们带来了reg2int
纳入范围,并给予其更高的优先级。
有关编译器如何搜索隐式的更多详细信息,请参阅 Daniel Sobral 的非常好的解释:Scala 在哪里寻找隐式? https://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)