Scala 3隐式转换赋值生效但FancyDouble与Double字面量比较失效如何解决
问题根因
Scala 中==方法的参数类型为Any,编译器在解析d == 0.0语句时,右侧的0.0作为Any类型即可匹配==的方法签名,不需要做类型适配,因此不会主动触发你定义的Double到FancyDouble隐式转换,最终因跨类型比较触发编译报错。
可落地的解决方案
方案1:为FancyDouble扩展Double类型比较能力
在FancyDouble的伴生对象中添加比较运算符的扩展实现,原生支持和Double值直接比较:
opaque type FancyDouble = Double object FancyDouble: def apply(d: Double): FancyDouble = d given Conversion[Double, FancyDouble] = FancyDouble(_) // 新增比较逻辑扩展 extension (fd: FancyDouble) def ==(d: Double): Boolean = fd == FancyDouble(d) def !=(d: Double): Boolean = !(fd == d) // 按需可追加 >、<、>=、<= 等其他算术比较运算符
修改完成后if (d == 0.0)即可正常编译运行。
方案2:手动标注类型触发隐式转换
如果不想修改原有FancyDouble的定义,可在比较时显式指定字面量的预期类型,编译器会自动触发隐式转换:
// 标注0.0的预期类型为FancyDouble,触发隐式转换 if (d == (0.0: FancyDouble)) { // 业务逻辑 }
方案3:自定义专用比较运算符
如果不想重载原生==避免歧义,可自定义专属比较运算符使用:
extension (fd: FancyDouble) def ===(d: Double): Boolean = fd == FancyDouble(d) // 使用示例 if (d === 0.0) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Alexander Temerev
相关产品推荐
相关产品推荐

