scala学习第三篇之类型参数(泛型)

2023-05-16

概述:类型参数,说白了就是泛型,什么是泛型?广泛的类型,啥类型都有可能,是一种更加通用的表示,或者定义。
Scala中定义泛型的方式和java中稍微有点不同,java中<>,scala中[],其他都一样。

一、类上定义泛型

?:
/**
  * 泛型
  */
object GenericOps {
  def main(args: Array[String]) {
    val tool = new Tool[Int]()
    println(tool.add(1,2))
    println(tool.add(32,54,4,5))

    val tool1 = new Tool[String]()
    println(tool1.add("first","last"))
  }
}

class Tool[T] {
  def add(a:T,b:T) : T = {
    a
  }
  def add(arr:T*):T={
    arr(0)
  }
}

虽然上面定义了泛型类,但是不是很灵活,因为一旦在成员上面使用了这个类的泛型,那么便无法再使用其它类型。

二、方法上定义泛型

?:
object _03GenericOps {
  def main(args: Array[String]) {
    val tool = new Tool[Int]()
    tool.show[String]("show","your","name")
  }
}

class Tool[T] {
  def show[Q](arr:Q*): Unit ={
    println(arr.mkString(","))
  }
}

说明在方法上面使用的泛型,会覆盖掉类上定义的泛型

三、泛型界定和视图界定

Scala中的泛型界/限定的概念和java中的泛型的限定是一样的。
先用例子给大家看看,然后咱们总结一下:

?:
def main(args: Array[String]): Unit = {
    val array = Array[Int](1, 5, 3, 5, 6, 7, 2, 9)
    val strArr = Array[String]("abc", "def", "rst", "lmn")
    println("排序前的数组:" + array.mkString("[", ", ", "]"))
    selectSort(array)
    println("排序后的数组:" + array.mkString("[", ", ", "]"))
    /*
    val aa:Int = 3
    val bb = 4
    aa.compareTo(bb)
    */

def selectSort[T <% Comparable[T]](arr:Array[T]): Unit ={
    for (i <- 0 until arr.length ){
      for (j <- i until arr.length){
        if(arr(i).compareTo(arr(j))>0){
          swap(arr,i,j)
        }
      }
    }
  }

  def swap[T](arr:Array[T],i:Int,j:Int): Unit ={
    var temp = arr(i)
    arr(i) = arr(j)
    arr(j) = temp
  }
  }

总结:
上限限定(掌握)

在java中的语法结构
在scala中语法结构[T <: Xxx]
如果使用通配符的话,用?

下限限定(了解)

在java中的语法结构
在scala中语法结构[T >: Xxx]
通配符用_

在scala中让一个类型具备比较性,一般都是用Ordered[T] --对应–> java中的Comparable[T]
在scala中让一个集合提供比较器,一般都用Ordering[T] --定义–>java中的 Comparator[T]

这里看到,Int类型没有直接扩展Comparable接口,所以我们不能直接对齐进行使用xx.compareTo的操作,也就是说如果类型[T <: Comparable[T]]的,此时T是Int,编译无法通过,但是只要做一下稍微的搞定即可[T <% Comparable[T]],编译就可以通过,当然如果想让之前的代码通过,只需要将Int该成Integer即可。
val aaa:Int = 3
val bb = 4
aaa.compareTo(bb),这个是直接可以进行操作,这和上面Int没有扩展Comparable矛盾,所以肯定在背后有人来帮助
Int做了实现,达到的效果就是对Int做了包装,RichInt extends Comparable[RichInt]
以后但凡出现Int,会自动的转化为RichInt,这个操作就是隐式转化
在定义的使用手动进行类型转化,就用到了scala中视图界定 <%

四、协变和逆变

在Java中泛型的一个特点,在java中规定,=左右两侧的泛型都必须是一致,
其实这就是多态,父类引用指向子类对象

List<Object> list = new ArrayList<Person>();
list.add(new Person());    
list.add(new Student());

List<Person> list2 = new ArrayList<Object>();
list2.add(new Person());
list2.add(new Student());

以上两种操作方式都是错误的,不被允许的。把这种操作称之为泛型的继承。
那么在scal中是如何规定的呢?
在这里插入图片描述
在默认情况下,scala也不允许出现上述泛型继承的现象。
但是非常灵活的scala,在特殊情况下是允许这些情况的方式,也就是对应的协变和逆变。在定义泛型的时候,添加一个符号即可[+T]协变,[-T]逆变。
协变指的是等号左侧的泛型是右侧的超类,逆变指的是等号左侧的泛型是右侧的子类。
多用于集合的操作。

object _04T {
  def main(args: Array[String]) {
    val list1:MyList1[Object] = new MyList1[Person]()
    val list2:MyList2[Person] = new MyList2[Object]()
    val list3:List[Object] = List[Person]()
  }
  class MyList1[+T] { //把这种泛型的继承称之为协变
  }
  class MyList2[-T] {//把这种泛型的继承称之为逆变
  }
}

class Person{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala学习第三篇之类型参数(泛型) 的相关文章

  • 利用opencv 做一个简单的人脸识别

    文章目录 安装 实现 人脸识别 进行人脸模型训练 识别人脸测试 效果展示 完整代码 想开发一个属于自己的人脸识别系统 动手开始吧 本项目源代码 github 戳我戳我戳我 本项目演示视频 B站戳我戳我戳我 加入界面的效果 安装 opencv
  • android -- 蓝牙 bluetooth (二) 打开蓝牙

    4 2的蓝牙打开流程这一部分还是有些变化的 xff0c 从界面上看蓝牙开关就是设置settings里那个switch开关 xff0c widget开关当然也可以 xff0c 起点不同而已 xff0c 后续的流程是一样的 先来看systemS
  • 使用JMF实现java写自己的视频播放器

    JMF这个多媒体开发框架太牛了 xff0c 简单的几句代码就能实现一个视频播放器的开发 xff0c 厉害 xff0c 就是支持的格式少了一些 xff0c 没关系 xff0c 这个视频播放器可以播放mpg xff0c avi fvl等等 xf
  • 如何用yolov5 做个闯红灯监控的智能交通系统(1)

    文章目录 闲聊 效果 思路 步骤 下载小视频 检测算法实现 跟踪算法实现 红绿灯的情况判断 头盔判断 红绿灯抓拍 关于检测算法的提取和封装 目标跟踪算法提取 闲聊 前几天骑电瓶车被厦门交警抓拍了 发了一条短信给我 您于 月 号 没带头盔 请
  • 利用opencv 做一个疲劳检测系统(2)

    文章目录 杂谈实现步骤核心算法交互界面界面代码检测效果源代码 杂谈 最近发现视力下降严重 xff0c 可能跟我的过度用眼有关 xff0c 于是想着能不能做一个检测用眼疲劳的 xff0c 灵感来自特斯拉的疲劳检测系统 效果如下 xff1a 实
  • 损失函数的盘点与总结

    文章目录 公式L1L2Smooth l1 公式 L1 L2 L1 令 x 61 fx y 有Lx 61 x 求导数 xff1a 我们知道梯度更新方法为 xff1a 这样会有一个问题就是 为0 的时候不可导 xff0c 另外当梯度很小时 xf
  • python 实现感知机

    span class token keyword import span span class token module numpy span as np span class token keyword import span span
  • 将标签文件转换为不同的数字

    将标签文件转换为不同的数字 说明 通过网上下载的数据 xff0c 可能是单标签的 xff0c 所以都是0 如果有三个类 xff0c 则需要转换成0 1 2 下面代码可以将labels 的所有数据转成你想要的label import os o
  • linux中安装vnc软件以及下载安装

    linux中安装时安装vnc软件 linux安装vnc配置软件 安装vnc软件 yum span class token function install span y tigervnc server xterm xclock span c
  • Mac配置中文 man 手册

    文章目录 查看自己的电脑的 man 信息中文手册地址构建依赖环境安装获取中文手册可以查看中文文档是否已经加载添加手册路径 将别名添加进 zsh xff08 可要可不要 xff09 解决乱码完结 查看自己的电脑的 man 信息 查看已经加载的
  • 生产者/消费者问题的多种Java实现方式

    生产者 消费者问题的多种 Java 实现方式 实质上 xff0c 很多后台服务程序并发控制的基本原理都可以归纳为生产者 消费者模式 xff0c 而这是恰恰是在本科操作系统课堂上老师反复讲解 xff0c 而我们却视而不见不以为然的 在博文 一
  • pandas读取表格时候header的用法

    1 header 61 0 读取一个music的dataframe 不设置header xff0c 则pandas会默认header 61 0 也就是数据表的第一行为表头 span class token keyword import sp
  • win10系统补丁彻底终止更新的方法

    我们经常在电脑上安装应用软件 xff0c 难免会遇到诸如win10系统无法更新正在暂停 xff0c 将暂停更新直到2018 1 2 为止的状况 xff0c 尤其是姑娘们遇到win10系统无法更新正在暂停 xff0c 将暂停更新直到2018
  • android -- 蓝牙 bluetooth (三)搜索蓝牙

    接上篇打开蓝牙继续 xff0c 来一起看下蓝牙搜索的流程 xff0c 触发蓝牙搜索的条件形式上有两种 xff0c 一是在蓝牙设置界面开启蓝牙会直接开始搜索 xff0c 另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索 xff0c 也可能
  • AD域控管理之授权普通用户或组管理计算机加入域和退出域的权限

    通过委派任务来实现 xff0c 具体如下 xff1a 1 在域控上打开Active Directory 用户和计算机 xff0c 右击域名 注意 将计算机加入域 只能在域上委派 xff0c 不能在OU上 xff0c 选择 委派控制 2 下一
  • IBM serverx服务器RAID阵列磁盘配置JBOD模式(直通模式)

    关于直通模式现在应用较多的是vmware的vsan分布式存储 现在通过IBM serverx 3850X6服务器演示如何配置JBOD模式磁盘 配置JBOD模式的前提是服务器不能安装有带缓存的raid卡 xff0c 其实也就是不能做raid5
  • 关于IBM 3550 3650 3850 在BIOS设置legacy模式

    1 在Boot Manager中 xff0c 选择add Boot Option xff0c 选择legacy only 2 在Go to Boot Manager gt Change Boot Order中 xff0c 把legacy o
  • IBM storwize V5000存储基础配置

    初始帐号密码 Superuser passw0rd 设备和系统的基本状态 首先添加配置主机 xff0c 前提是已经连接好光纤线 xff0c 配置好光纤交换机 这里我们使用光纤通道 系统应该可以自动识别到端口 xff0c 主机名可以设置为主机
  • 关于 Virtual SAN/VSAN 的常见问题解答

    问 xff1a VSAN 需要使用 SSD xff0c 它有什么用途呢 xff1f 答 xff1a SSD 用于读取缓存 70 和写入缓冲 30 每次写入都会先转到 SSD xff0c 稍后再取消暂存到 HDD 问 xff1a 创建 VSA
  • Linux 安装 VNC Server 实现图形化访问配置说明

    CentOS 6 5 系统环境下 xff0c 可以参阅如下步骤进行 VNC Server 的安装配置 安装 使用如下指令安装 VNC Server xff1a span class pln style margin 0px padding

随机推荐