项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

在前面的文章里,我们讲了在java中如何利用泛型实现数值类型加法。具体可以参考博文http://blog.csdn.net/bitcarmanlee/article/details/78733637。
那么在scala中,我们怎么实现上面的需求呢?

1.用 <: 模拟extends关键字行不通

如果按照在java中的处理思路,我们可以这么尝试一下:

    def numberAdd[T <: Number](t1 : T, t2 : T) = {t1.doubleValue() + t2.doubleValue()}@Testdef numberaddtest() = {val (t1, t2) = (1, 2)numberAdd(t1, t2)}

在scala中,<:表示类型的上限,与java中的extends含义一样。我们试图将上面的test方法run起来,发现IDE中报错:

Error:(26, 19) type mismatch;found   : Intrequired: TnumberAdd(t1, t2)
Error:(26, 9) inferred type arguments [Int] do not conform to method numberAdd's type parameter bounds [T <: Number]numberAdd(t1, t2)
Error:(26, 23) type mismatch;found   : Intrequired: TnumberAdd(t1, t2)

很明显,上面的方法是行不通的。

2.使用Numeric[T]

为什么上面的方法行不通呢?因为Scala的数字类型并不都共享一个超类,所以我们不能使用T <: Number。相反,要使之能工作,Scala的math库对适当的类型T 定义了一个隐含的Numeric[T],我们可以使用他来完成类似的功能。

首先上可以运行的代码:

    def add[T](x: T, y: T)(implicit num: Numeric[T]) = {val result = num.plus(x, y)result}@Testdef testAdd() = {val int1 = 1val int2 = 2println("int sum is: " + add(int1, int2))val long1 = 100Lval long2 = 200Lprintln("long sum is: " + add(long1, long2))val f1 = 1.0fval f2 = 2.0fprintln("float sum is: " + add(f1, f2))val d1 = 1.0val d2 = 2.0println("double sum is: " + add(d1, d2))}

将上面的test方法run起来,可以得到如下输出:

int sum is: 3
long sum is: 300
float sum is: 3.0
double sum is: 3.0

3.Numeric[T]的用法

Numeric[T]在scala中源码如下:

  type Numeric[T] = scala.math.Numeric[T]val Numeric = scala.math.Numeric

当然,我们也可以通过implicitly方法,用context bound(上下文绑定)的方式让上面的代码更简单:

    def add2[T: Numeric](x: T, y: T) = {implicitly[Numeric[T]].plus(x, y)}

其中,implicitly方法在scala中的定义如下:

@inline def implicitly[T](implicit e: T) = e    // for summoning implicit values from the nether world

implicitly 主要是在当前作用域查找指定类型,例如以下的例子:

    @Testdef testimplicit() = {implicit val x = 1implicit val x1 = 2.0val y = implicitly[Int]val z = implicitly[Double]println(y + "\t" + z)}

将test方法run起来以后,输出如下:

1    2.0

4.数值集合求和

搞定了单个的数值求和,那么数值集合的求和自然就变得容易了:

    def add4[T: Numeric](x : Array[T]) = {var sum = 0.0for(each <- x) {sum += implicitly[Numeric[T]].toDouble(each)}println(sum)}@Testdef test() = {val array = Array(1, 2, 3)add4(array)}

代码输出:

6.0

参考内容:

1.https://stackoverflow.com/questions/4373070/how-do-i-get-an-instance-of-the-type-class-associated-with-a-context-bound
2.https://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala
3.http://www.jianshu.com/p/1d119c937015 Scala中的Implicit详解
4.https://vimsky.com/article/1562.html scala常见问题整理
5.https://fangjian0423.github.io/2015/06/07/scala-generic/ scala泛型

scala实现数值类型加法相关推荐

  1. scala的数值类型(三)

    Scala是一门多范式的编程语言,集成了面向对象编程和函数式编程的各种特性.其函数也能当成值来使用.Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化.Scal ...

  2. python bool类型_Python 的内置数值类型

    Python 是一种敏捷的.动态类型化的.极富表现力的开源编程语言,可以被自由地安装到多种平台上.Python 代码是被解释的.如果您对编辑.构建和执行循环较为熟悉,则 Python 代码对您来说更简 ...

  3. python语言整数类型-Python 的内置数值类型

    Python 是一种敏捷的.动态类型化的.极富表现力的开源编程语言,可以被自由地安装到多种平台上.Python 代码是被解释的.如果您对编辑.构建和执行循环较为熟悉,则 Python 代码对您来说更简 ...

  4. python提供了两种基本的数值类型_Python 基本数据类型

    Python 基本数据类型 Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型&q ...

  5. js --- 转数值类型

    方式一:通过Number( )转换 语法:Number(你要转换的数据) 结果(返回值):转换好的数值类型的数据 转换机制:会把你要转换的数据看作是一个整体,如果可以转换成一个合法的数字,那么结果就是 ...

  6. Scala——(常用类型与字面量,Scala类层次结构,值与变量自动类型推断,操作符,块表达式和赋值语句,输出和输出,字符串插值器,对象相等性)

    文章目录 常用类型与字面量 Scala类层次结构 值与变量&自动类型推断 操作符 块表达式和赋值语句 输出和输出 字符串插值器 对象相等性 常用类型与字面量 Scala和Java一样,有8种数 ...

  7. python数值类型不包含复数_[python学习手册-笔记]003.数值类型

    003.数值类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...

  8. Java数值类型与补码关系讨论

    随着学习计算机知识的加深,许多地方都遇到原码.反码.补码.很多关于计算机的书籍都介绍原码.反码.补码的表示方法,但是为什么要用到原码.反码.补码却没详细说.为什么要使用?我们知道数值在计算机中表示形式 ...

  9. 简述python中的数值类型_Python中的数值类型

    本文将介绍Python语言的一种基本数据类型:数值类型. 一. 数值类型 Python语言的数值类型有四种,分别是:整型.长整型.浮点型和复数类型.下面我们首先介绍整型数据. 1.整型 Python语 ...

  10. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

最新文章

  1. signature=0a26d8967069103efeee67346aac0529,Construction of Thinned Gated Single-Assignment Form
  2. shell语法简单介绍
  3. 友盟开放日: 通过 App 内社区提高留存率的 6 个技巧
  4. 一道解决的非常漂亮的算法题
  5. 选择日期保存报错Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String......
  6. mysql查询当天数据(上周、本月、上个月、距离当前现在6个月的数据)
  7. 电脑常见问题_解决PC常见问题 篇二十:垃圾佬手把手教你如何正确缩电脑配置砍预算...
  8. 论文笔记_S2D.12-2019-ITSC-DFuseNet: 用于图像稠密深度补全的RGB和稀疏深度信息深度融合的网络
  9. python文本风格_Python风格规范-FYI
  10. 抖音直播带货后如何复盘?抖音直播间高效复盘法
  11. 蓝精灵协会 (The Smurfs‘ Society) 宣布与著名艺术家展开一系列的合作,打造传奇 PFP 系列
  12. Linux-CentOS 安装yasm
  13. 苹果Home键恢复(无工具篇)
  14. PostgreSQL 源码解读(35)- 查询语句#20(查询优化-简化Having和Grou...
  15. 使用python+Selenium动态爬取《率土之滨》藏宝阁账号信息
  16. 破解SQLYog30天试用方法
  17. 大型三国战争策略型网页游戏-乐趣网《卧龙吟》
  18. CVPR 2022|U2PL:使用不可靠伪标签的半监督语义分割
  19. 微信小程序云函数调用本地调用返回值中result为undefined
  20. cocos creator教程【打造路径编辑系统】

热门文章

  1. docker相关实验
  2. shell脚本使用getopts自定义传入参数选项
  3. Spark技术互动问答分享
  4. paip.hql的调试故障排查流程总结
  5. AudioSession property 详解及使用方法,包括检测是否有声音正在运行,音量更改等。...
  6. drools rule (二) LHS语法详解
  7. 单例模式的两种实现方法:饿汉式和懒汉式以及民间懒汉式和登记式
  8. PythonServer
  9. Linux部分命令使用说明
  10. 开发者论坛一周精粹(第六期):阿里B2B研发管理难题如何应对?打造强有力的技术中台...