首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala专用通用数字操作

scala专用通用数字操作
EN

Stack Overflow用户
提问于 2014-12-06 10:55:11
回答 2查看 370关注 0票数 2

我想要一个封装整数和浮点数的类。

基本上我想做这样的事

Const(5) + Const(6) = Const(11) Const(5) + Const(6.0) = Const(11.0)

编译器错误的代码。

代码语言:javascript
复制
case class Const[@specialized(Long,Double) T](value:T){

  def +(that:Const[T]) : Const[T] = {
    Const(this.value + that.value)
  }

}

-错误

:11:错误:类型不匹配;找到:t必需: String Const(this.value + that.value)

(不知道为什么要解析到字符串+操作符)

EN

回答 2

Stack Overflow用户

发布于 2017-11-02 06:14:58

您希望能够以与Scala添加不同数值类型相同的方式添加Const类的实例。但是Scala并不直接添加不同的数值类型,它首先使用隐式转换使它们成为相同的类型。你也能做到的。首先,您需要将Numeric添加到您的类中,正如Gábor所指出的:

代码语言:javascript
复制
case class Const[@specialized(Long, Double) T: Numeric](value: T) {
  import Numeric.Implicits._
  def +(that: Const[T]) = Const(value + that.value)
}

然后,定义隐式转换:

代码语言:javascript
复制
implicit def constConvert[A, B: Numeric](a: Const[A])(implicit conv: A => B) =
  Const[B](a.value)

这将接受隐式转换,从而将内置的隐式转换概括为您的类型。现在你可以写:

代码语言:javascript
复制
Const(5) + Const(6.0)  // Const(11.0)

它编译成如下所示:

代码语言:javascript
复制
constConvert(Const(5))(_.toDouble) + Const(6.0)

由于Scala为上转换数值类型提供了合理的隐式转换,而且constConvert方法接受这样的隐式转换,所以这通常适用于内置的数值类型,以及定义合理转换和数值的任何新类型。

不过!

您应该意识到,在这里您不会真正获得专门化的全部好处,因为标准库Numeric并不是专门化的(在撰写本文时),所以仍然会出现自动装箱。相反,您可能希望使用Numeric的专门版本,比如尖顶提供的版本。

票数 1
EN

Stack Overflow用户

发布于 2014-12-06 11:21:27

下面是一个工作版本(当两个实例被不同类型参数化时,为了兼容使用,类型参数是必需的):

代码语言:javascript
复制
  case class Const[@specialized(Long, Double) T: scala.Numeric](value:T){

    def +(that:Const[T]) : Const[T] = {

      //Const(implicitly[Numeric[T]].mkNumericOps(this.value) + that.value)
      import Numeric.Implicits._
      Const(this.value + that.value)

    }

  }

用法:Const[Double](2) + Const(3.3)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27330872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档