1. scala泛型浅析

package com.dtspark.scala.basics

/**
* 1,scala的类和方法、函数都可以是泛型。
* * 2,关于对类型边界的限定分为上边界和下边界(对类进行限制)
* 上边界:表达了泛型的类型必须是"某种类型"或某种类型的"子类",语法为“<:”,
* 下边界:表达了泛型的类型必须是"某种类型"或某种类型的"父类",语法为“>:”,
* * 3, "<%" :view bounds可以进行某种神秘的转换,把你的类型在没有知觉的情况下转换成目标类型,
* 其实你可以认为view bounds是上下边界的加强和补充,语法为:"<%",要用到implicit进行隐式转换(见下面例子)
* * 4,"T:classTag":相当于动态类型,你使用时传入什么类型就是什么类型,(spark的程序的编译和运行是区分了Driver和Executor的,只有在运行的时候才知道完整的类型信息)
* 语法为:"[T:ClassTag]"下面有列子
* * 5,逆变和协变:-T和+T(下面有具体例子)+T可以传入其子类和本身(与继承关系一至)-T可以传入其父类和本身(与继承的关系相反),
* * 6,"T:Ordering" :表示将T变成Ordering[T],可以直接用其方法进行比大小,可完成排序等工作
*/ class Person(val name:String){
def talk(person:Person){
println(this.name+" speak to "+person.name)
}
} class Worker(name:String) extends Person(name) class Dog(val name:String) //注意泛型用的是[]
class Club[T<:Person](p1:T,p2:T){//"<:"必须是person或person的子类
def comminicate = p1.talk(p2)
} class Club2[T<%Person](p1:T,p2:T){
def comminicate = p1.talk(p2)
} class Engineer
class Expert extends Engineer
//如果是+T,指定类型为某类时,传入其子类或其本身
//如果是-T,指定类型为某类时,传入其父类或其本身
class Meeting[+T]//可以传入T或T的子类 class Maximum[T:Ordering](val x:T,val y:T){
def bigger(implicit ord:Ordering[T])={
if(ord.compare(x, y)>0) x else y
}
} object HelloScalaTypeSystem {
def main(args: Array[String]): Unit = {
val p= new Person("Spark")
val w= new Worker("Scala")
new Club(p,w).comminicate //"<%"的列子
//只是提供了一个转换的方法,在遇到<%时会调用,看dog是否被转换了。
implicit def dog2Person(dog:Dog)=new Person(dog.name)
val d = new Dog("dahuang")
//注意必须强制类型转换,implicit中虽然是将dog隐式转换成person,
//但是其实是对象擦除,变成了object,所以还要强制类型转换成person后才能使用
//用[person]强制转换
new Club2[Person](p,d).comminicate //-T +T例子,下面的participateMeeting方法指定具体是什么泛型
val p1=new Meeting[Engineer]
val p2=new Meeting[Expert]
participateMeeting(p1)
participateMeeting(p2)
// T:Ordering 的例子
println(new Maximum(3,5).bigger)
println(new Maximum("Scala","Java").bigger) }
//这里指定传入的泛型具体是什么
def participateMeeting(meeting:Meeting[Engineer])= println("welcome") }

T:ClassTag的例子(根据输入动态定义)

命令行代码:

scala> import scala.reflect.ClassTag
import scala.reflect.ClassTag scala> def mkArray[T: ClassTag](elems: T*) = Array[T](elems: _*)
mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T] scala> mkArray(1,2,3)
res1: Array[Int] = Array(1, 2, 3) scala> mkArray("ss","dd")
res2: Array[String] = Array(ss, dd)
scala> mkArray(1,"dd")
res2: Array[Any] = Array(1, dd)

2. scala 的作用域

Scala的作用域并不特别,完全可以参考类似的C语言或者Java的作用域要求。
简而言之就是:对于同名变量来说,大括号内部定义的变量会覆盖大括号外部的变量,局部变量覆盖成员变量,大括号内部import的类、变量、方法覆盖外部的。只有一种情况比较特殊,就是自身成员不会被import导入的成员覆盖。
不过实际使用中并不会经常出现变量重名的情况,所以作用域的意义更多在于访问限制。这一条一般来说一句话就可以概括:作用域限定于定义或导入该变量或类的大括号及内层大括号嵌套中。

scala的泛型浅析的更多相关文章

  1. Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  2. Scala的泛型

    类比java中的泛型: 上界(协变).下界(逆变) scala中泛型采用中括号声明 val array = Array[Int](,,,) array() //声明什么类型就返回什么类型 //test ...

  3. Java基础之多态和泛型浅析

    Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...

  4. 大数据学习day17------第三阶段-----scala05------1.Akka RPC通信案例改造和部署在多台机器上 2. 柯里化方法 3. 隐式转换 4 scala的泛型

    1.Akka RPC通信案例改造和部署在多台机器上  1.1 Akka RPC通信案例的改造(主要是把一些参数不写是) Master package com._51doit.akka.rpc impo ...

  5. Scala学习——泛型[T]的6种使用(初)

    package com.dtspark.scala.basics /** * 1,scala的类和方法.函数都可以是泛型. * * 2,关于对类型边界的限定分为上边界和下边界(对类进行限制) * 上边 ...

  6. Scala类型参数(泛型)与隐式转换

    package com.yz9 import org.junit.Test import scala.collection.mutable.ListBuffer class test { @Test ...

  7. Scala API - 泛型

  8. 第42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用

    今天来了解下scala的泛型 先让我们看下这段代码 class Triple[F,S,T](val first:F,val second: S,val third: T) val triple = n ...

  9. scala泛型

    package com.ming.test /** * scala泛型 * 类型参数测试 */ object TypeParamsTest { //泛型函数 def getMiddle[T](a:Ar ...

随机推荐

  1. oracle OPEN FOR [USING] 语句

    目的:        和ref cursor配合使用, 可以将游标变量分配给不同的SQL (而不是在declare中把游标给定死), 增加处理游标的灵活性语法: declare type type_c ...

  2. Vue生命周期钩子函数加载顺序的理解

    Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁的过程,就是生命周期 ...

  3. Linux设备驱动程序学习----目录

    目录 设备驱动程序简介 1.设备驱动程序简介 构造和运行模块 2.内核模块和应用程序的对比 3.模块编译和装载 4.模块的内核符号表  5.模块初始化和关闭  6.模块参数  7.用户空间编写驱动程序 ...

  4. kotlin中对象表达式

    在kotlin中,也有类似的功能,但不是匿名类,而是对象,需要使用object关键字,对象要继承的列需要与object之间的冒号(:)分隔. fun main(arg: Array<String ...

  5. smarty 模板几个例子(变量调节器)

    一.assign和display方法的使用以及几个变量调节器 header("content-type:text/html;charset=utf-8");//加载Smarty引擎 ...

  6. git服务器搭建---便签做备注

    今天,简单搭建了一下git服务器.发现一篇文章写的挺好的 http://www.cnblogs.com/trying/archive/2012/06/28/2863758.html 并简单和廖雪峰的结 ...

  7. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_11-修改页面-前端-Api调用

    修改数据 这是提交按钮的事件editSubmit 注意修改的方法是put方法.所以用requestPut 操作成功自动返回 测试 成功后自动跳转到列表页 修改后的数据

  8. PHP 调用C# WebService

    在VS2010中新建WebService:Finance.asmx 代码如下: using System.Web.Services; namespace WebTest.WebService { // ...

  9. Ubuntu+Django+uWSGI+Nginx部署Django项目

    安装uWSGI,pip依据自己要使用的python版本自行选择,python2.x版本使用pip进行安装,python3.x版本使用pip3进行安装 pip install uwsgi 配置uWSGI ...

  10. JAVA数据结构和算法 6 递归

    递归:直接或者间接地调用自己.比如计算连续数的阶乘,计算规律:n!=(n-1)!*n. 每个递归方法都有一个基值(终止)条件,以防止无线地递归下去,以及由此引发的程序崩溃. 采用递归是因为它可以从概念 ...