作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
采取以下代码:
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
和y
的范围的原因。但是,转换bool2int
确实需要在范围内,因为它不是在Boolean
或Int
伴随对象上定义的。 +
方法,以通过any2stringadd
中的隐式scala.Predef
表示字符串连接。定义val z
是非法的,因为字符串连接的隐式优先于reg2int
(在伴随对象中发现的隐式优先级相对较低)。但是,定义val z2
起作用是因为我们将reg2int
纳入了范围,使其具有更高的优先级。 关于scala - Scala隐式转换范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6906742/
我是一名优秀的程序员,十分优秀!