是否可以覆盖Scala中的内置运算符?

时间:2013-06-24 08:41:49

标签: scala operator-overloading

这是一个假设的问题,但是我想说我想改变范围内+ Int(或任何其他算术运算符)的行为,就像这样(我知道)它是疯狂的东西,我总是试图避免,但我发现它很有趣):

object MySillyStuff extends App {
  def +(a: Int, b: Int) = a*b;

  println(1+2)
}

这是可能的,或者我只能通过新类型的隐式转换来重载运算符? (即,我必须明确地创建1作为该新类型的成员,并对该特定类型使用2的隐式转换。)

1 个答案:

答案 0 :(得分:4)

请注意,scala中没有运算符。问题+Int的方法:(1).+(2)

覆盖现有方法的唯一方法是使用override关键字继承。

隐式类允许您添加新方法,但不能覆盖已存在的方法。

您可以使用value classes这样包装您的课程,而不是开销:

case class StrangeInt(val i: Int) extends AnyVal {
  def +(that: Int): StrangeInt = StrangeInt(i*that)
}

val i = StrangeInt(3)
println(i+3)
// StrangeInt(9)