Scala进阶实战

  • 泛型
  • 类型变量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
}

//RT的父类
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)
}

你可能感兴趣的:(Scala)