scala泛型

news/2024/11/17 12:42:59/

目录

类型参数

泛型函数:

 协变,逆变,不变

泛型上下限:

上下文限定:


泛型是一种类型参数,该类型参数可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法

类型参数

调用时不指定[T]:可以通过给泛型声明的变量传递值来让scala自动推断泛型的实际类型;返回的是使表达式编译通过的合适的类型;在编译时不会检查类型是否满足
调用时指定[T]:可以在函数的调用时候指定泛型的类型;则返回对就必须是T类型;会在编译时检查类型,不满足泛型规则编译不通过

 泛型类

在类声明时,定义一些泛型类型,然后在类的内部,就可以使用这些泛型类型
在需要对类中的某些成员,如字段或方法中的参数进行统一的类型限制时,可以使用泛型类,使得程序具有更好的健壮性和稳定性
在使用类的时候,将类型参数替换为实际的类型即可
scala会自动推断泛型类型:给泛型类型的字段赋值时,scala会自动对类型进行推断

 class Stack[A] {private var elements: List[A] = Nildef push(x: A) { elements = x :: elements }def peek: A = elements.headdef pop(): A = {val currentTop = peekelements = elements.tailcurrentTop}}// Stack 类的实现中接受类型参数 A。 这表示其内部的列表,var elements: List[A] = Nil,只能够存储类型 A 的元素。//方法 def push 只接受类型 A 的实例对象作为参数def main(args: Array[String]): Unit = {val stack = new Stack[Int]stack.push(1)stack.push(2)println(stack.pop)  // prints 2println(stack.pop)  // prints 1}

泛型函数:

  • 与泛型类相似,在声明函数时指定泛型类型,然后在函数体内,多个变量或返回值,就可以使用泛型类型进行声明。
  • 可以通过给使用了泛型类型的变量传递值,让scala自动推断泛型的实际类型,也可以在调用函数的时候,手动指定泛型的实际类型
class Triple[X, Y, Z](val first: X, val second: Y, val thrid: Z)object Hello_Type_Parameterization {def main(args: Array[String]): Unit = {//在定义后scala的类型推断会得出triple类型为 Triple[String, Int, Double]val triple = new Triple("Spark", 3, 3.1415926)//显示声明类型val bigData = new Triple[String, String, Char]("Spark", "Hadoop", 'R')//定义泛型函数def getData[T](list: List[T]) = list(list.length / 2)println(getData(List("Spark", "Hadoop", 'R')))  //Hadoop//显式指定类型val f = getData[Int] _      //val f: List[Int] => Intprintln(f(List(1,2,3,4,5,6,7,8))) //5//定义参数也存在上下文的约束def foo[A, B](f: A => List[A], b: A) = f(b)}
}

 协变,逆变,不变

语法:

说明:

 协变:Son 是 Father 的子类,则 MyList[Son] 也作为 MyList[Father]的“子类”。

 逆变:Son 是 Father 的子类,则 MyList[Son]作为 MyList[Father]的“父类”。

 不变:Son 是 Father 的子类,则 MyList[Father]与 MyList[Son]“无父子关系”。

案例:

泛型上下限:

语法:

上限可以传入Type自身或者子类

下限可以传入Type自身或者父类

说明:

  泛型的上下限的作用是对传入的泛型进行限定。

案例:

上下文限定:

语法:

说明:

  上下文限定是将泛型和隐式转换的结合产物,以下两者功能相同,使用上下文限定[A : Ordering]之后,方法内无法使用隐式参数名调用隐式参数,需要通过 implicitly[Ordering[A]] 获取隐式变量,如果此时无法查找到对应类型的隐式变量,会发生出错误。

案例:


http://www.ppmy.cn/news/38562.html

相关文章

力扣刷题笔记23—— 二叉树中和为某一值的路径/DFS和BFS/push_back和emplace_back的差异/移动构造函数

二叉树中和为某一值的路径/DFS和BFS/push_back和emplace_back的差异/移动构造函数问题示例代码方法一深度优先搜索方法二广度优先搜索push_back和emplace_back移动构造函数问题 来自力扣: 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所…

ToBeWritten之杂项2

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

因果分析系列11----不依从性和LATE

因果分析系列11----不依从性和LATE 1. 异质性2. 局部平均处理效应3. 对参与者的影响小结加载第三方包及全局设定 import warnings warnings.filterwarnings(ignore)import pandas as pd import numpy as np from scipy import stats from matplotlib import style import

HCIP网络类型

目录标题网络类型以太网HDLC-高链路控制协议(光电转换)PPP---点到点协议GRE通用路由封装MGRE网络类型 点到点:在同一个网段内只能存在两个节点 MA多路访问:在同一个网段内,节点的数量不限制,正常需要存在二…

ToBeWritten之车联网落地VSOC方案

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

Spark 内核调度之DAG

文章目录一、DAG介绍二、DAG和分区三、DAG中的宽窄依赖和阶段的划分1. 宽窄依赖的划分2. 阶段划分一、DAG介绍 Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理R…

6.3 分配学号

任务描述 本关任务:完成学号分配。 输入格式 第一行输入学生姓名‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪;第二行输入班级。 输出格式‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪…

Java:SpringBoot实现ApplicationEvent事件的监听和发布

通过发布订阅模式实现数据的异步处理,比如异步处理邮件发送 新建SpringBoot项目 项目结构 . ├── pom.xml └── src└── main├── java│ └── com│ └── example│ └── demo│ ├── Application.java│ …