一文详解scala泛型及类型限定

640?wx_fmt=png

今天知识星球球友,微信问浪尖了一个spark源码阅读中的类型限定问题。这个在spark源码很多处出现,所以今天浪尖就整理一下scala类型限定的内容。希望对大家有帮助。

640?wx_fmt=png

 

640?wx_fmt=pngscala类型参数要点

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的子类(或本身,自己也可以认为是自己的子类)。

640?wx_fmt=png泛型与约束实战

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讲实现链式计算

640?wx_fmt=png


文章来源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/81916961

posted @ 2018-09-11 14:01  王凤霞  阅读(1675)  评论(0编辑  收藏  举报
友情链接:回力 | 中老年高档女装 | 武汉雅思 | 武汉托福 | 武汉sat培训