1. package com.dtspark.scala.basics
  2.  
  3. /**
  4. * 1,scala的类和方法、函数都可以是泛型。
  5. *
  6.  
  7. * 2,关于对类型边界的限定分为上边界和下边界(对类进行限制)
  8. * 上边界:表达了泛型的类型必须是"某种类型"或某种类型的"子类",语法为“<:”,
  9. * 下边界:表达了泛型的类型必须是"某种类型"或某种类型的"父类",语法为“>:”,
  10. *
  11.  
  12. * 3, "<%" :view bounds可以进行某种神秘的转换,把你的类型在没有知觉的情况下转换成目标类型,
  13. * 其实你可以认为view bounds是上下边界的加强和补充,语法为:"<%",要用到implicit进行隐式转换(见下面例子)
  14. *
  15.  
  16. * 4,"T:classTag":相当于动态类型,你使用时传入什么类型就是什么类型,(spark的程序的编译和运行是区分了Driver和Executor的,只有在运行的时候才知道完整的类型信息)
  17. * 语法为:"[T:ClassTag]"下面有列子
  18. *
  19.  
  20. * 5,逆变和协变:-T和+T(下面有具体例子)+T可以传入其子类和本身(与继承关系一至)-T可以传入其父类和本身(与继承的关系相反),
  21. *
  22.  
  23. * 6,"T:Ordering" :表示将T变成Ordering[T],可以直接用其方法进行比大小,可完成排序等工作
  24. */
  25.  
  26. class Person(val name:String){
  27. def talk(person:Person){
  28. println(this.name+" speak to "+person.name)
  29. }
  30. }
  31.  
  32. class Worker(name:String)extends Person(name)
  33.  
  34. class Dog(val name:String)
  35.  
  36. //注意泛型用的是[]
  37. class Club[T<:Person](p1:T,p2:T){//"<:"必须是person或person的子类
  38. def comminicate = p1.talk(p2)
  39. }
  40.  
  41. class Club2[T<%Person](p1:T,p2:T){
  42. def comminicate = p1.talk(p2)
  43. }
  44.  
  45. class Engineer
  46. class Expert extends Engineer
  47. //如果是+T,指定类型为某类时,传入其子类或其本身
  48. //如果是-T,指定类型为某类时,传入其父类或其本身
  49. class Meeting[+T]//可以传入T或T的子类
  50.  
  51. class Maximum[T:Ordering](val x:T,val y:T){
  52. def bigger(implicit ord:Ordering[T])={
  53. if(ord.compare(x, y)>)x else y
  54. }
  55. }
  56.  
  57. object HelloScalaTypeSystem {
  58. def main(args: Array[String]): Unit = {
  59. val p= new Person("Spark")
  60. val w= new Worker("Scala")
  61. new Club(p,w).comminicate
  62.  
  63. //"<%"的列子
  64. //只是提供了一个转换的方法,在遇到<%时会调用看dog是否被转换了。
  65. implicit def dog2Person(dog:Dog)=new Person(dog.name)
  66. val d = new Dog("dahuang")
  67. //注意必须强制类型转换,implicit中虽然是将dog隐式转换成person,
  68. //但是其实是对象擦除,变成了object,所以还要强制类型转换成person后才能使用
  69. //用[person]强制转换
  70. new Club2[Person](p,d).comminicate
  71.  
  72. //-T +T例子,下面的participateMeeting方法指定具体是什么泛型
  73. val p1=new Meeting[Engineer]
  74. val p2=new Meeting[Expert]
  75. participateMeeting(p1)
  76. participateMeeting(p2)
  77. // T:Ordering 的例子
  78. println(new Maximum(,).bigger)
  79. println(new Maximum("Scala","Java").bigger)
  80.  
  81. }
  82. //这里指定传入的泛型具体是什么
  83. def participateMeeting(meeting:Meeting[Engineer])= println("welcome")
  84.  
  85. }

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

命令行代码:

  1. scala> import scala.reflect.ClassTag
  2. import scala.reflect.ClassTag
  3.  
  4. scala> def mkArray[T: ClassTag](elems: T*) = Array[T](elems: _*)
  5. mkArray: [T](elems: T*)(implicit evidence$: scala.reflect.ClassTag[T])Array[T]
  6.  
  7. scala> mkArray(,,)
  8. res1: Array[Int] = Array(, , )
  9.  
  10. scala> mkArray("ss","dd")
  11. res2: Array[String] = Array(ss, dd)
  12. scala> mkArray(,"dd")
  13. res2: Array[Any] = Array(, dd)

Scala泛型[T]的使用的更多相关文章

  1. scala泛型

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

  2. Scala泛型详解

    在Scala中你可以使用类型参数来实现类和函数,这样的类和函数可以用于多种类型.比如Array[T] 你可以存放任意指定类型T的数据. 类.特质.函数都可以有类型参数:将类型参数放在名字后面用方括号括 ...

  3. 17. Scala泛型、上下界、视图界定、上下文界定

    17.1 泛型的基本介绍 17.1.1 基本介绍 1) 如果我们要求函数的参数可以接受任意类型,可以使用泛型,这个类型可以代表任意的数据类型 2) 例如List,在创建List时,可以传入整型.字符串 ...

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

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

  5. Scala进阶之路-Scala中的泛型介绍

    Scala进阶之路-Scala中的泛型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 通俗的讲,比如需要定义一个函数,函数的参数可以接受任意类型.我们不可能一一列举所有的参数类 ...

  6. Scala入门到精通——第十六节 泛型与注解

    本节主要内容 泛型(Generic Type)简单介绍 注解(Annotation)简单介绍 注解经常使用场景 1. 泛型(Generic Type)简单介绍 泛型用于指定方法或类能够接受随意类型參数 ...

  7. scala的泛型浅析

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

  8. Scala 基础(十六):泛型、类型约束-上界(Upper Bounds)/下界(lower bounds)、视图界定(View bounds)、上下文界定(Context bounds)、协变、逆变和不变

    1 泛型 1)如果我们要求函数的参数可以接受任意类型.可以使用泛型,这个类型可以代表任意的数据类型. 2)例如 List,在创建 List 时,可以传入整型.字符串.浮点数等等任意类型.那是因为 Li ...

  9. Scala进阶之路-Scala中的Ordered--Ordering

    Scala进阶之路-Scala中的Ordered--Ordering 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   说道对象的比较,在Java中大家最熟悉不过的就是实现类本身实 ...

随机推荐

  1. C语言程序设计--执行命令

    1.system函数 1.1函数原型 int system(char *command); 1.2解释 system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来 ...

  2. QT textBrowser 使用

    使用环境: VS2010 & QT Designer5 1. 在QT Designer 拖入  textBrowser,点击右键属性获得 name值 2. 在程序使用的地方 加入  ui.te ...

  3. C++服务器下载文件的两种方式

    #include <afxinet.h>#include "wininet.h" #pragma comment( lib, "wininet.lib&quo ...

  4. (ecj)Eclipse的Java编译器分析之一——ecj介绍

    Java是一个开放的平台,对于除发布编译器/解释器/基础类库之外,该语言的负责机构更多的是制定一系列标准,任何符合标准的厂商产品均可用于市场投放.甚至包括其编译器及解释器. (比如Hibernate提 ...

  5. zouxy09-图像卷积与滤波的一些知识点

    原文地址 图像卷积与滤波的一些知识点 zouxy09@qq.com http://blog.csdn.net/zouxy09 之前在学习CNN的时候,有对卷积进行一些学习和整理,后来就烂尾了,现在稍微 ...

  6. springboot面试题总结

    什么是springboot         用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)                  创建独立的s ...

  7. 洛谷 P1223排队接水【贪心】

    题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别 ...

  8. 基于ASP.NET Core Data Protection生成验证token

    ASP.NET Core Data Protection 不仅提供了非对称加密能力,而且提供了灵活的秘钥存储方式以及一致的加解密接口(Protect与Unprotect).Session中用到了它,C ...

  9. mysql日期格式转换,如何保持原日期?CONVERT/Substring 函数截取。replace替换

    http://www.cnblogs.com/stevenjson/p/3729577.html CONVERT(varchar(100), getdate(), 112)这种, 问题就出在getda ...

  10. plsql developer 安装

    PLSQL Developer 安装分以下几步: 一.下载Oracle客户端 PLSQL Developer是通过oracle client连上Oracle server的. http://www.o ...