Scala进阶源码实战之六——类型变量

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_parameterization

import java.util.Comparator


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
  }
}

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_paraments
import scala.reflect.ClassTag
class 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 中用的并不多,作为了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值