这是一个假设性的问题,但是假设我想在一个范围内改变+
(或任何其他算术运算符)的行为Int
,就像这样(我知道这很疯狂,我会尽量避免一般来说,但我觉得很有趣):
object MySillyStuff extends App {
def +(a: Int, b: Int) = a*b;
println(1+2)
}
这可能是这种方式,还是我只能通过使用新类型的隐式转换来重载运算符?(即,我必须显式创建1
该新类型的成员,并2
为该特定类型使用隐式转换)。
这是一个假设性的问题,但是假设我想在一个范围内改变+
(或任何其他算术运算符)的行为Int
,就像这样(我知道这很疯狂,我会尽量避免一般来说,但我觉得很有趣):
object MySillyStuff extends App {
def +(a: Int, b: Int) = a*b;
println(1+2)
}
这可能是这种方式,还是我只能通过使用新类型的隐式转换来重载运算符?(即,我必须显式创建1
该新类型的成员,并2
为该特定类型使用隐式转换)。
请注意,scala 中没有运算符。问题+
是Int
:的方法(1).+(2)
。
覆盖现有方法的唯一方法是使用override
关键字继承。
隐式类允许您添加新方法,但不能覆盖已经存在的方法。
您可以使用如下值类来包装您的类而无需开销:
case class StrangeInt(val i: Int) extends AnyVal {
def +(that: Int): StrangeInt = StrangeInt(i*that)
}
val i = StrangeInt(3)
println(i+3)
// StrangeInt(9)