一文详解scala泛型及类型限定
今天知识星球球友,微信问浪尖了一个spark源码阅读中的类型限定问题。这个在spark源码很多处出现,所以今天浪尖就整理一下scala类型限定的内容。希望对大家有帮助。
scala类型参数要点
1. 非变
trait Queue[T] {}?
这是非变情况。这种情况下,当类型S是类型A的子类型,则Queue[S]不可认为是Queue[A]的子类型或父类型,这种情况是和Java一样的。?
2. 协变
trait Queue[+T] {}?
这是协变情况。这种情况下,当类型S是类型A的子类型,则Queue[S]也可以认为是Queue[A}的子类型,即Queue[S]可以泛化为Queue[A]。也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变。?
3. 逆变
trait Queue[-T] {}?
这是逆变情况。这种情况下,当类型S是类型A的子类型,则Queue[A]反过来可以认为是Queue[S}的子类型。也就是被参数化类型的泛化方向与参数类型的方向是相反的,所以称为逆变。?
4. 类型下界
U >: T
这是类型下界的定义,也就是U必须是类型T的父类(或本身,自己也可以认为是自己的父类)。
5. 类型上届
S <: T
这是类型上界的定义,也就是S必须是类型T的子类(或本身,自己也可以认为是自己的子类)。
泛型与约束实战
1?泛型函数
ClassTag[T]保存了泛型擦除后的原始类型T,提供给被运行时的。
2?类型变量界定
泛型参数类型限定,限定具体类的可以调用特定的方法。
3?泛型视图限定
泛型视图限定:表示把传入不是Comparable[T]类型的隐式传换为Comparable[T]类型,Comparable[T]:为T下界,T:为Comparable[T]上界。
4?上下文界定
上下文界定:上下文界定是隐式参数的语法糖。如:Ordering:可以进行隐式转化的T类型。
Manifest关键字:数组在声明时必须要求指定具体的类型,在函数泛型是无法知道具体类型,英语词性通过Manifest关键字使得运行时可以根据这个Manifest参数做更多的事情。
6?ClassTag关键字
ClassTag[T]保存了泛型擦除后的原始类型T,提供给被运行时的。
在引入Manifest的时候,还引入了一个更弱一点的ClassManifest,所谓的弱是指类型信息不如Manifest那么完整。用TypeTag替代了Manifest,用ClassTag替代了ClassManifest,原因是在路径依赖类型中,Manifest存在问题。
更多scala,spark,大数据知识,希望扩展视野解决疑难杂症及困惑,欢迎点击阅读原文,加入浪尖知识星球。
本文整理自网络,若有侵权,请联系微信158570986删除。
推荐阅读:
Scala语法基础之隐式转换
Scala语言基础之结合demo和spark讲实现链式计算
文章来源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/81916961