risc-v中文社区

 找回密码
 立即注册
查看: 1066|回复: 0

[原创] scala隐式转换范围

[复制链接]

5

主题

8

帖子

49

积分

新手上路

Rank: 1

积分
49
发表于 2021-7-28 17:25:30 | 显示全部楼层 |阅读模式
object ImplicitScope {

  implicit def ImplicitScopeClass2String(isc:ImplicitScopeClass) = isc.name
  implicit def ImplicitScopeClass2Int(isc:ImplicitScopeClass) = isc.age


}
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
}

object Tobj {
  def main(args: Array[String]): Unit = { //代码来自:Scala隐式转换范围问题 http://www.cocoachina.com/articles/253612
    //在上面这个网页中说到:当编译器查找隐式转换时先查伴生对象中是否有隐式转换,这好理解
    //但编译器在查伴生对象之前还要查scala默认导入的包中(三个java.lang._,scala._,scala.Predef._),如果默认包中有相应的隐式转换操作存在,则不会查伴生对象中的隐式转换了
    //而Predef中有any2String默认隐式转换,所以要想val x = register.getZeroFlag + 10正确,则必须要import Register._,这样,Register中的隐式转换就比默认包中的优先级高
    val register = new Register(0x81)
    import Register._ //发现:无import则编译错误,有import虽然IDEA提示错误但能编译能执行成功
    val x = register.getZeroFlag + 10
//    val x = register.getZeroFlag - 10  //改为-号之后,需要import才语法正确
    println(x)
  }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-27 17:57 , Processed in 0.031279 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表