码迷,mamicode.com
首页 > 编程语言 > 详细

大数据学习之Scala语言的高级特性42

时间:2019-06-19 15:04:32      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:img   数据类型   作用   key   com   ddt   变量   自己的   strong   

1、什么是泛型类

Java或者C++一样,类和特质可以带类型参数。在Scala中,使用方括号来定义类型参数

技术图片

测试程序:

 技术图片

2、什么是泛型函数

函数和方法也可以带类型参数。和泛型类一样,我们需要把类型参数放在方法名之后。

注意:这里的ClassTag是必须的,表示运行时的一些信息,比如类型。

技术图片

3、Upper Bounds 与 Lower Bounds

类型的上界和下界,是用来定义类型变量的范围。它们的含义如下:

l S <: T

这是类型上界的定义。也就是S必须是类型T的子类(或本身,自己也可以认为是自己的子类。

 

u U >: T

这是类型下界的定义。也就是U必须是类型T的父类(或本身,自己也可以认为是自己的父类)

 

l 一个简单的例子:

技术图片

 

l 一个复杂一点的例子(上界):

技术图片

l 再来看一个例子:

技术图片

 

 

4、视图界定(View bounds)

它比 <: 适用的范围更广,除了所有的子类型,还允许隐式转换过去的类型。用 <% 表示。尽量使用视图界定,来取代泛型的上界,因为适用的范围更加广泛。

示例:

上面写过的一个列子。这里由于T的上界是String,当我们传递100200的时候,就会出现类型不匹配。

技术图片

但是100200是可以转成字符串的,所以我们可以使用视图界定让addTwoString方法接收更广泛的数据类型,即:字符串及其子类、可以转换成字符串的类型

注意:使用的是 <% 

技术图片

l 但实际运行的时候,会出现错误:

技术图片

这是因为:Scala并没有定义如何将Int转换成String的规则,所以要使用视图界定,我们就必须创建转换的规则。

 

l 创建转换规则

技术图片

l 运行成功

技术图片

 

5、协变和逆变

l 协变:

Scala的类或特征的范型定义中,如果在类型参数前面加入+符号,就可以使类或特征变为协变了。

技术图片

 

逆变:

在类或特征的定义中,在类型参数之前加上一个-符号,就可定义逆变范型类和特征了。

技术图片

 

总结一下:Scala的协变:泛型变量的值可以是本身类型或者其子类的类型

              Scala的逆变:泛型变量的值可以是本身类型或者其父类的类型

 

6、隐式转换函数

所谓隐式转换函数指的是以implicit关键字申明的带有单个参数的函数。

l 前面讲视图界定时候的一个例子:

技术图片

再举一个例子:我们把Fruit对象转换成了Monkey对象

技术图片

 

7、隐式参数

使用implicit申明的函数参数叫做隐式参数。我们也可以使用隐式参数实现隐式的转换

技术图片

8、隐式类

所谓隐式类: 就是对类增加implicit 限定的类,其作用主要是对类的功能加强

技术图片

 

大数据学习之Scala语言的高级特性42

标签:img   数据类型   作用   key   com   ddt   变量   自己的   strong   

原文地址:https://www.cnblogs.com/hidamowang/p/11051178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!