zoukankan      html  css  js  c++  java
  • 大数据学习之Scala语言的高级特性42

    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 限定的类,其作用主要是对类的功能加强

  • 相关阅读:
    转载一篇不错的Mac上安装Apache和多版本PHP的文章
    Mac 上配置tomcat 及可能碰到的问题。
    iOS通知中心 NSNotificationCenter详解
    字符缓冲区读取文件BufferedReader
    BufferedWriter—newLine
    缓冲流复制文件与基本流复制文件比较
    BufferedOutputStream缓冲流
    properties集合
    JDK7,JDK9流中异常的处理
    try-catch-finally处理流中的异常
  • 原文地址:https://www.cnblogs.com/hidamowang/p/11051178.html
Copyright © 2011-2022 走看看