Scala进阶实战
2015-07-27 11:23
375 查看
泛型
类型变量bounds
View Bound
Context Bounds
Manifest ClassTag
多重界定
类型约束
协变 逆变
类型变量bounds
View Bound
Context Bounds
Manifest ClassTag
多重界定
类型约束
协变 逆变
泛型
class Triple[T, P, S](val a : T, val b : P, val c :S) val triple = new Triple("Spark", 3, 3.141592654) val bigData = new Triple[String, String, Char]("Spark","scala",'c') def getData[T](list : List[T]) = list(list.length/2) println(getData(List("Spark","Hadoop",'R'))) val f = getData[Int] _ println(f(List(1,2,3,4,5))) def biuldArray[T : ClassTag](len : Int) = new Array[T](len) println(biuldArray[Int](5).toList)
类型变量bounds
//T是Comparable[T]的子类 class Pair[T <: Comparable[T]](val first : T, val second : T){ def bigger = if(first.compareTo(second) > 0)first else second } //R是T的父类 class Pair_Lower_Bound[T](val first : T, val second : T){ def replaceFirst[R >: T](newFirst : R) = new Pair_Lower_Bound[R](newFirst, second) } val pair =new Pair("Spark","Hadoop") println(pair.bigger)
View Bound
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 } //隐式转换Int => richInt val pairInt =new Pair_NotPerfect(3, 5) println(pairInt.bigger) //隐式转换String => richString val pairString =new Pair_NotPerfect("Spark", "Hadoop") println(pairInt.bigger) val pairInt_Pair_Better =new Pair_Better(20, 50) println(pair_Pair_Better.bigger) val pair_Pair_Better =new Pair_Better("Spark", "Hadoop") println(pair_Pair_Better.bigger)
Context Bounds
class 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 } } val pair = new Pair_Ordering("Spark", "Hadoop") println(pair.bigger) val pairInt = new Pair_Ordering(3, 5) println(pairInt.bigger)
Manifest/ ClassTag
def arrayMake[T : Manifest](first : T, second : T) = { val r = new Array[T](2) r(0) = first r(1) = second r } arrayMake(1, 2).foreach(println) def manif[T](x : List[T])(implicit m : Manifest[T]) ={ if (m <:< manifest[String]) println("List strings") else { println("Some other type") } } manif(List("Spark", "Hadoop")) manif(List(1, 2)) manif(List("Scala", 3)) class A[T] val m = manifest[A[String]] println(m) val cm = classManifest[A[String]] println(cm) def mkArray[T : ClassTag](elems : T*) = Array[T](elems : _*) mkArray(42,13).foreach(println) mkArray("Japan","Brazil","Germany").foreach(println)
多重界定
//T是A和B的子类 def fun[T <: A with B] //下界是A上界是B def fun[T >: A <: B] //T : A &&T :B def fun[T : A : B] //T通过隐式转换可以转AB def fun[T <% A <% B]
类型约束
// A =:= B //表示A类型同等于B // A <:< B //表示A类型是B类型的子类型 def fun[T](i : T)(implicit x : T <:< java.io.Serializable){ println("Great") fun("Scala") //fun(1) X
协变/ 逆变
//A>:B List[A]>:List[B]是协变 //A>:B List[A]<:List[B]是逆变 //协变+逆变- class P[+T](val first : T, val second : T){ def replaceFirst[R >: T](newFirst : R) = new P[R] (newFirst, second) }
相关文章推荐
- Windows7下安装Scala 2.9.2教程
- XML 文件解析--含Unicode字符的XML文件
- 分分钟掌握快速排序(Java / Scala 实现)
- Scala极速入门
- Spark初探
- Scala实现REST操作
- Scala method call syntax
- 关于Scala多重继承的菱形问题
- Scala 高阶函数(high-order function)剖析
- Spray.io搭建Rest服务
- Spray.io搭建Rest — 支持Twirl模板并部署
- 搭建hadoop/spark集群环境
- ScalaMP ---- 模仿 OpenMp 的一个简单并行计算框架
- 用Scala实现延迟计算
- SBT学习 [持续更新...]
- Scala创建新的控制结构
- Scala: 一次命令式到函数式的重构
- 浅谈Scala的特质(trait)
- 浅谈Scala 2.8的包对象(package object)