Scala进阶源码实战之六——类型变量
来源:互联网 发布:视频编辑软件 编辑:程序博客网 时间:2024/06/17 05:13
View Bounds 视图界定
package com.dt.scala.type_parameterization//class Pair_NotPerfect[T <: Comparable[T]](val first : T,val second : T){// def bigger = if(first.compareTo(second) > 0)first else second //}// <% 学术名称就是视图界定class Pair_NotPerfect[T <% Comparable[T]](val first : T,val second : T){ def bigger = if(first.compareTo(second) > 0)first else second }class Pair_Better[T <% Ordered[T]](val first : T,val second : T){ def bigger = if(first > second)first else second }object View_Bounds { def main(args: Array[String]) { val pair = new Pair_NotPerfect("Spark", "Hadoop") println(pair.bigger) val pairInt = new Pair_NotPerfect(3, 5) //Int -> RichInt println(pairInt.bigger) val pair_Better_String = new Pair_Better("Java", "Scala") //String -> RichString println(pair_Better_String.bigger) val pair_Better_Int = new Pair_Better(20, 12) println(pair_Better_Int.bigger) }}
Context Bounds
package com.dt.scala.type_parameterizationimport java.util.Comparatorclass Pair_Ordering[T : Ordering] (val first : T, val second : T){ def bigger(implicit ordered: Ordering[T]) = { if (ordered.compare(first, second) > 0) first else second }}object Context_Bounds { def main(args: Array[String]) { val pair = new Pair_Ordering("Spark", "Hadoop") println(pair.bigger) val pairInt = new Pair_Ordering(3, 5) println(pairInt.bigger) }}
ClassTag 、Manifest、ClassManifest、TypeTag
package type_paramentsimport scala.reflect.ClassTagclass A[T]object classtag { println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet def arrayMake[T : Manifest](first : T, second : T) = { val r = new Array[T](2); r(0) = first; r(1) = second; r //看下面已经生成了隐式值 } //> arrayMake: [T](first: T, second: T)(implicit evidence$3: Manifest[T])Array[T //| ] arrayMake(1,2).foreach(println) //> 1 //| 2 //实际中用的最多的是ClassTag 可以代替Manifest //运行时将泛型擦除,通过上下文推断 def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*) //> mkArray: [T](elems: T*)(implicit evidence$4: scala.reflect.ClassTag[T])Array //| [T] mkArray(42, 13).foreach(println) //> 42 //| 13 mkArray("Japan","Brazil","Germany").foreach(println) //> Japan //| Brazil //| Germany def manif[T](x: List[T])(implicit m: Manifest[T]) = { if (m <:< manifest[String]) println("List strings") else println("Some other type") } //> manif: [T](x: List[T])(implicit m: Manifest[T])Unit manif(List("Spark", "Hadoop")) //> List strings manif(List(1, 2)) //> Some other type manif(List("Scala", 3)) //> Some other type val m = manifest[A[String]] //> m : Manifest[type_paraments.A[String]] = type_paraments.A[java.lang.String] //| println(m) //> type_paraments.A[java.lang.String] val cm = classManifest[A[String]] //> cm : ClassManifest[type_paraments.A[String]] = type_paraments.A[java.lang.S //| tring] println(cm) //> type_paraments.A[java.lang.String]}
多重界定
class M_A[T]class M_B[T]object Multiple_Bounds { def main(args: Array[String]) { implicit val a = new M_A[Int] implicit val b = new M_B[Int] def foo[ T : M_A : M_B ](i:T) = println("OK") foo(2) }}
类型约束
def rocky[T](i:T)(implicit ev: T <:< java.io.Serializable) { print("Life is short,you need spark!") } rocky("Spark")
Variance
spark 中用的并不多,作为了解
0 0
- Scala进阶源码实战之六——类型变量
- Scala进阶源码实战之七——链式调用、结构类型
- Scala进阶源码实战之二——面向对象
- Scala进阶源码实战之四——模式匹配
- Scala进阶源码实战之三——文件IO、正则表达式、高阶函数
- Scala进阶源码实战之五——List、Queue、Stack、Set、Map
- Scala进阶源码实战之八——隐式转换和隐式参数
- Scala 类型系统实战之编程进阶(4)
- Scala深入浅出进阶经典 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析
- scala-43:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析
- Scala进阶源码实战之一——数组、函数基础、流程控制、文件、异常
- scala进阶2-类型变量界定Bounds
- Scala深入浅出进阶经典 第48讲:Scala类型约束代码实战及其在Spark中的应用源码解析
- 43.Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析
- 云星数据---Scala实战系列(精品版)】:Scala入门教程011-Scala实战源码-变量声明
- Scala进阶实战
- 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析学习笔记
- scala学习之: scala的结构类型代码实战
- 数据结构求一个矩阵的马鞍点
- 初识Python
- Java 工程师成神之路
- CodeForces - 552C Vanya and Scales (进制转换&技巧)好题
- 使用 P3P 规范让 IE 跨域接受第三方 cookie
- Scala进阶源码实战之六——类型变量
- hive inser into 与 hive overwrite区别
- Spark SQL
- 自定义排序数组二分法插入实现
- 趣味素数-素数 java
- Hibernate中的int和 Serializable
- java中常用的集合极其特点
- 百度地图api为标注设置与删除文字标签
- 对Xabber源码解析的过程(2)connection