此代码无效!
def add(a: Int, b: Int): Int = a plus b
所以,我尝试像这样定义plus
:
def plus(a: Int, b: Int): Int = a + b
但是,编译器仍抱怨Cannot resolve symbol plus
!
有什么想法吗?
答案 0 :(得分:4)
a plus b
无法正常工作,因为它是a.plus(b)
的简写,标准库中的Int
上没有此类方法。为了完成这项工作,你必须加强" Int
类通过隐式转换。
implicit class MyPlus[T](a: T)(implicit ev:Numeric[T]) {
def plus(b: T): T = ev.plus(a,b)
}
现在您可以执行3 plus 5
或a plus b
等。
您也可以这样做(更简洁,更易读,但基本上相同):
import Numeric.Implicits._
implicit class MyPlus[T: Numeric](a: T) {
def plus(b: T): T = a + b
}
答案 1 :(得分:1)
由于a
中的add
是Int
,而scala.Int
没有plus
方法,我们需要创建一个隐式转换{ {1}}包含scala.Int
并具有Int
方法的内容:
plus
现在,一切正常:
implicit class IntWithPlus(val i: Int) extends AnyVal {
def plus(other: Int) = i + other
}
另一种方法是创建一个类型def add(a: Int, b: Int): Int = a plus b
add(2, 3)
// => 5
,该类型将导入到本地命名空间阴影Int
中,并为该类型提供scala.Int
方法。