Scala 上界介绍和应用实例1 | 学习笔记

简介: 快速学习 Scala 上界介绍和应用实例1

开发者学堂课程【Scala 核心编程 - 进阶Scala 上界介绍和应用实例1学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9152


Scala 上界介绍和应用实例1


内容介绍

一、上界(Upper Bounds)介绍和使用

二、scala 中上界应用案例-要求


一、上界(Upper Bounds)介绍和使用

>java 中上界

Java 泛型里表示某个类型是A类型的子类型,使用 extends 关键字,这种形式叫 upper bounds(上限或上界),

语法如下:

<Textends A>

//或用通配符的形式:

<? extends A>

在Scala里面做了一个改进的形式

>scala中上界

scala 里表示某个类型是A类型的子类型,也称上界或上限,使用<:关键字,

语法如下:

[T <: A]

//或用通配符:

[_<: A]


二、scala中上界应用案例-要求

1)编写干个通用的类,可以进行 Int 之间、Float 之间、等实现了

Comparable 接口的值直接的比较.//java.lang.Integer

2)分别使用传统方法和上界的方式来完成,体会上界使用的好处

//如果用传统的方法来做,有几种类型就得写几种。如果用上界这个方式就可以做成通用的形式。

class CompareInt(n1:Int,n2:Int){

def greater =ifn1 >n2n1 elsen2

}

class CompareCommT<:Comparable[U]](obj1:Tobj2: T){

def greater=if(obj1.compareTo(obj2)>0)obj1elseobj2

}

//映射转换Predef.scala

首先建个包:image.png

建立文档:

image.png

可以看到:

package com.atguigu.chapter18.upperbounds

object UpperBoundsDemo01 {

def main(args: Array[String]): Unit = {

java.lang.Integer

}

}

这里的Integer做了什么角色:

image.png

事实上是实现了 comparable 这个接口,再往里看

这样就可以进行比较。

下面演示代码:

package com.atguigu.chapter18.upperbounds

object UpperBoundsDemo01 {

def main(args: Array[String]): Unit = {

val compareInt=newCompareInt(1040) println(compareInt.greater)// 40

}

}

/*

编写一个通用的类,可以进行Int之间、Float之间、等实现了Comparable接口的值直接的比较.//java.lang.Integer

分别使用传统方法和上界的方式来完成,体会上界使用的好处。

*/

//传统方法

class CompareInt(n1: Int,n2: Int) {

//返回较大的值

def greater = if(n1 > n2) n1 else n2

}

点击运行:

image.png

正确。

但是传统的方法有个问题:

float还需要再写一份。

因为没用泛型,也没用到上下界。float传不进去的比如把10换成10.1,这个代码就不匹配了。当然也可以用其他方法,但是现在我们要用上界来解决。

下面讲解如何使用上界的方法来解决问题:

}

}

//使用上界(上限)来完成

//说明

//1.「T<:Comparable[T]]表示T类型是Comparable子类型

//2.即你传入的T类要继承Comparable接口

//3,这样就可以使用compareTo方法

//4.这样的写法(使用上界的写法) 通用性比传统的好

class CommonCompareT<:Comparable[T]】(obi1:T.obj2:T){

def greater = if (obj1.compareTo(obj2) > 0) obj1 else obj2}

下面实施一下:

package com.atguigu.chapter18.upperbounds

object UpperBoundsDemo01 {

def main(args: Array[String]): Unit = {

val compareInt=newCompareInt(1040) println(compareInt.greater)// 40

//我们看一下这种方法能不能成功:val commonCompare1 = new CommonCompare(10, 40) println(commonCompare1.greater)

这样是否可以呢?填10和40有没有实现compare接口?10和40是Int类型,在Scala里并没有实现 compare。

所以会报错:

image.png

因为要求是实现 compare,我们知道integer它是实现了的。下面写代码:

//第一个用法

val commonCompare1 = new CommonCompare(Integer.valueof(10),Integer.valueof(40))//lnteger实现compare接口,因此就满足上界的子类型

//Int

println(commonCompare1.greater)    

执行:

image.png

可以看出这个写法是可以实施的。

第二种方法:

val commonCompare2 = new CommonCompare(Float.valueOf(10.1),Float.valueof(42.1))//Int println(commonCompare1.greater)

}

//这样写大家看是否可以?答案是不可以的,他报错了,因为这里的floatscala里面的float,进去看scala里面是个object,它这个里面并没有像我们想象的那种valueof的方法。

所以怎么办

val commonCompare2 = new CommonCompare(java.lang.float.valueof(1.1f),java.lang.float.valueof(2.1f))

}

//Int

println(commonCompare1.greater)

这个时候你会发现第二个方法通用性要比第一个好很多,只要写一份,只要他那边实现compare接口就可以用

下面执行一下效果:

image.png

这还不算完。还有一个更简单的的方法:

val commonCompare3= new CommonCompare(1.1f, 2.1f) //

println(commonCompare3.greater)

想一下这样写可不可以?

很显然虽然语法能过但是是跑不起来的。因为1.1f并没有实现comparable,也就是说并不是我们这个

这样运行仍然会报错:

image.png

但是又不想麻烦的写,我们要如何去写?

前面这个地方是可以指定一个类型的,看看它能不能搞定。

看一段源码:

Impact Predef这个包追进去看看里面有什么东西打开过后,我们发现有大量的的东西都在里面。往下找,有好多implicit隐式函数:

image.png

再往下看:

有个float 2 float:

image.png

意思是如果有一个x:float,可以转成java.long.float.

前面的float是scala里面的,后面的是Java的float。这样才实现了compare结构,他就是这么来的。

//第三种写法使用了隐式转换:

val commonCompare3 = new CommonCompare[java.lang.float]( 10.1f, 21.1f)

//Int

下面执行一下:

println(commonCompare1.greater)    

image.png

这个语法第一用了上界,第二用了隐式转换,这个语法糖还是很高级的。

以上就是第一个案例。

相关文章
|
算法
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
537 0
|
7月前
|
传感器 边缘计算 云计算
边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡
边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡
660 32
边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡
|
机器学习/深度学习 人工智能 算法
探索未来:量子计算与人工智能的融合之路
在科技飞速发展的今日,量子计算与人工智能的结合被视为开启新时代的钥匙。本文将探讨量子计算的原理、挑战以及其与人工智能结合的可能性和前景。我们将通过案例分析和最新研究数据来揭示这一跨学科领域如何推动技术革新,并讨论其对社会发展的潜在影响。读者将获得对这一激动人心领域的深刻理解,同时引发对未来技术趋势的思考。
414 30
|
存储 Kubernetes 算法
在K8S中,etcd组件功能及其特点是什么?
在K8S中,etcd组件功能及其特点是什么?
|
监控 数据可视化 测试技术
云效流水线 Flow 评测:助力企业高效完成 CICD 全流程
云效流水线 Flow 评测显示其在CI/CD领域表现出色,尤其适合新人上手。具备直观的可视化编辑和Yaml化选项,丰富的文档教程,以及全面的功能,如多代码源支持、自动化测试、稳定部署及阿里云服务集成。此外,Flow性能稳定,监控功能强,且高度可扩展,支持插件和API集成。相比其他工具,Flow在成本、功能和性能上有竞争优势,特别适合与阿里云生态结合的团队。作为一款易用且性价比高的工具,Flow值得推荐给各类企业。
1045 12
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的注意力机制:技术洞察与应用前景
在人工智能的浪潮下,深度学习技术以其强大的数据处理和模式识别能力引领着技术发展的前沿。特别是注意力机制的引入,它模仿人类视觉注意力的选择性聚焦,极大地提高了模型处理序列数据的效率和准确度。本文将深入解析注意力机制的原理,探讨其在自然语言处理、计算机视觉等领域的应用,并预测未来的发展趋势。通过严谨的逻辑推理和丰富的数据支撑,我们旨在展现注意力机制如何成为深度学习领域的重要创新点。
|
运维 Shell 网络安全
第十八章 Python批量管理主机(paramiko、fabric与pexpect)
第十八章 Python批量管理主机(paramiko、fabric与pexpect)
|
缓存 网络架构
路由器的结构以及工作原理
路由器的结构以及工作原理
522 0
|
JavaScript
【实用模板】Vue代码文件常用后台管理页面模板
【实用模板】Vue代码文件常用后台管理页面模板