Scala隐式转换范围问题
发布时间:2020-12-16 19:08:39 所属栏目:安全 来源:网络整理
导读:拿这个代码: 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 } 我想这样使用它: v
拿这个代码:
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 怎么了?我是否需要定义一个隐式的函数返回一个bool? 解决方法
这是一个演示如何使用implicits的示例:
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和y的范围.但是,转换bool2int确实需要在范围内,因为它没有在Boolean或Int伴随对象上定义. 有关编译器如何搜索implicits的更多详细信息,请参阅Daniel Sobral的非常好的解释:Where does Scala look for implicits? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |