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]
    的存在,如果你想一想,这是非常合乎逻辑的。整数是实数的子域,但知道如何乘以整数并不意味着你知道如何乘以实数
  • to.First主要在运行时处理,而second通常在编译时处理。它们在scala中以非常特定的方式交互
  • 没有一个地方定义隐式值。对于代码中的每个特定类型和位置

  • 你的问题中有几个不正确的假设:

  • 是所有基元类型和的超类型。它是两个类型分支之一,植根于类型,这是所有基元类型的真正超类型
  • 类型不是,这意味着
    Numeric[Int]
    的存在并不意味着
    Numeric[AnyVal]
    的存在,如果你想一想,这是非常合乎逻辑的。整数是实数的子域,但知道如何乘以整数并不意味着你知道如何乘以实数
  • to.First主要在运行时处理,而second通常在编译时处理。它们在scala中以非常特定的方式交互
  • 没有一个地方定义隐式值。对于代码中的每个特定类型和位置
  • 你不能对“anyval”求和,因为它没有定义如何做。但是你可以对“数值”事物求和。例如
    def listSum[t:numeric](xs:List[t]):t=xs.sum
    你不能对“anyval”求和,因为它没有定义如何做。但是你可以对“数值”事物求和。例如
    def listSum[t:numeric](xs:List[t]):t=xs.sum