Scala通用列表添加
我有以下职能:Scala通用列表添加,scala,implicit,subtyping,Scala,Implicit,Subtyping,我有以下职能: def listSum[T](xs :List[T])(implicit abc : Numeric[T]): T = { xs.sum } val IntList: List[Int] = List (1, 2, 3, 4) val DList: List[Double] = List (1.0, 2.0, 3, 4) 上面的代码示例工作正常,但当我更改为下面的函数时,它会停止工作,并出现错误 找不到参数的隐式值abc:Numeric[AnyVal]
def listSum[T](xs :List[T])(implicit abc : Numeric[T]): T = {
xs.sum
}
val IntList: List[Int] = List (1, 2, 3, 4)
val DList: List[Double] = List (1.0, 2.0, 3, 4)
上面的代码示例工作正常,但当我更改为下面的函数时,它会停止工作,并出现错误
找不到参数的隐式值abc:Numeric[AnyVal]
既然AnyVal
是基本类型,我可以做加法,不是吗
所有隐式定义在哪里
def listSum(xs :List[AnyVal])(implicit abc : Numeric[AnyVal]) = {
xs.sum
}
val AList: List[AnyVal] = List (1, 2, 3, 4)
我认为这也不起作用,原因也是一样的
def listSum[T](xs :List[T])(implicit abc : Numeric[T]): T = {
xs.sum
}
val BList : List[Boolean] = List(true, false)
println(listSum(BList))
数值[T]的所有隐式定义都在scala/math/Numeric.scala中定义
(假设scala 2.10.4)
Numeric[AnyVal]
没有隐式定义,因此第一个示例会出现错误(这是有意义的,因为在不了解底层类型的情况下无法定义数字操作)
Numeric[Boolean]
也没有隐式定义,这就是第二个示例中出现错误的原因(这也是有意义的,因为如果不考虑项目的特定领域,就不能定义布尔运算的加号
、减号
、次
、反号
,等等)
如果对您的项目有意义,您可以自己定义一个隐式的Numeric[Boolean]
,但是最好避免对布尔类型使用隐式的Numeric[T]。数值[T]的所有隐式定义都在scala/math/Numeric.scala中定义
(假设scala 2.10.4)
Numeric[AnyVal]
没有隐式定义,因此第一个示例会出现错误(这是有意义的,因为在不了解底层类型的情况下无法定义数字操作)
Numeric[Boolean]
也没有隐式定义,这就是第二个示例中出现错误的原因(这也是有意义的,因为如果不考虑项目的特定领域,就不能定义布尔运算的加号
、减号
、次
、反号
,等等)
如果对您的项目有意义,您可以自己定义一个隐式的
数值[Boolean]
,但最好避免将隐式数值[T]用于布尔类型。您的问题中有几个不相关的假设:
Numeric[Int]
的存在并不意味着Numeric[AnyVal]
的存在,如果你想一想,这是非常合乎逻辑的。整数是实数的子域,但知道如何乘以整数并不意味着你知道如何乘以实数你的问题中有几个不正确的假设:
Numeric[Int]
的存在并不意味着Numeric[AnyVal]
的存在,如果你想一想,这是非常合乎逻辑的。整数是实数的子域,但知道如何乘以整数并不意味着你知道如何乘以实数def listSum[t:numeric](xs:List[t]):t=xs.sum
你不能对“anyval”求和,因为它没有定义如何做。但是你可以对“数值”事物求和。例如def listSum[t:numeric](xs:List[t]):t=xs.sum