【发布时间】:2015-09-22 03:51:04
【问题描述】:
采用单个参数的方法可以在 Scal 中编写为中缀运算符。 IE。将 *(other:C) = foo(this, other) 添加到 C 类中,将允许我们编写 c1 * c2 而不是 foo(c1,c2)。但是有没有办法在你不能修改的现有类上定义中缀运算符?
例如如果我想写c1 + c2 而不是xor(c1,c2),其中c1,c2:Array[Byte],我显然不能修改Array-Class。
我找到this 并尝试过
implicit class Bytearray(a1:Array[Byte]) extends Anyval {
def +(a2:Array[Byte]) = xor(a1,a2)
}
但这似乎不起作用 (c1 + c2)。
类型不匹配,预期:String,实际:Array[Byte]
我认为问题可能是我使用+,所以我把它换成了xor
但是c1 xor c2只会导致
无法解析符号异或
有什么建议吗?
更新
有趣。我有一个class Foo,下面定义了一个object Foo,包含隐式类。这会导致上述错误。
然而,删除对象并将隐式类放入 trait BytearrayHandling 然后扩展它 (class Foo extends BytearrayHandling) 似乎可行。这是为什么呢?
【问题讨论】:
-
隐式类必须是某种对象的一部分,您必须导入它。如果您发布您尝试过的完整代码,也会有所帮助。
-
为什么“某种对象”不能是伴生对象(请参阅上面的编辑)?对我来说没有多大意义。
-
可以,但您仍然需要在使用隐式的上下文中导入它。
标签: scala operators implicit-conversion infix-notation infix-operator