当然,这个简单的测试按预期工作:
scala> var b = 2 b: 整数 = 2 斯卡拉> b += 1 标量> b res3: 整数 = 3
现在我将其纳入范围:
类 A(var x: Int) { def +=(y:Int) { this.x += y } } 隐式定义 int2A(i:Int) : A = new A(i)
我正在定义一个新类和一个 += 操作,以及当我想将 Int 添加到 A 的 Int 值时的方便隐式转换。
当“A”类根本不是表达式的一部分时,我从没想过这会影响我的常规 Int 操作的行为方式。
但它确实:
scala> var b:Int = 0 b: 整数 = 0 斯卡拉> b += 1 标量> b res29: 整数 = 0 斯卡拉> b += 2 标量> b res31: 整数 = 0
这里似乎发生的是 b:Int 被隐式转换为“A”,它没有绑定到任何变量,然后 += 被调用,丢弃结果。
Scala 似乎将隐式转换优先于已经定义给 Ints 的自然 += 行为(编译器魔术,而不是实际方法)。常识和 C++ 背景告诉我,只有在编译会失败的情况下,才应在不得已的情况下调用隐式函数。这导致了几个问题......
- 为什么?这是一个错误吗?是设计使然吗?
- 是否有解决方法(除了不为我的 DSL 的“+=”操作使用“+=”)?
谢谢