Scala泛型[T]的使用


package com.dtspark.scala.basics /** * 1,scala的類和方法、函數都可以是泛型。 * * 2,關於對類型邊界的限定分為上邊界和下邊界(對類進行限制) * 上邊界:表達了泛型的類型必須是"某種類型"或某種類型的"子類",語法為“<:”, * 下邊界:表達了泛型的類型必須是"某種類型"或某種類型的"父類",語法為“>:”, * * 3, "<%" :view bounds可以進行某種神秘的轉換,把你的類型在沒有知覺的情況下轉換成目標類型, * 其實你可以認為view bounds是上下邊界的加強和補充,語法為:"<%",要用到implicit進行隱式轉換(見下面例子) * * 4,"T:classTag":相當於動態類型,你使用時傳入什么類型就是什么類型,(spark的程序的編譯和運行是區分了Driver和Executor的,只有在運行的時候才知道完整的類型信息) * 語法為:"[T:ClassTag]"下面有列子 * * 5,逆變和協變:-T和+T(下面有具體例子)+T可以傳入其子類和本身(與繼承關系一至)-T可以傳入其父類和本身(與繼承的關系相反), * * 6,"T:Ordering" :表示將T變成Ordering[T],可以直接用其方法進行比大小,可完成排序等工作 */

class Person(val name:String){ def talk(person:Person){ println(this.name+" speak to "+person.name) } } class Worker(name:String)extends Person(name) class Dog(val name:String) //注意泛型用的是[]
class Club[T<:Person](p1:T,p2:T){//"<:"必須是person或person的子類
  def comminicate = p1.talk(p2) } class Club2[T<%Person](p1:T,p2:T){ def comminicate = p1.talk(p2) } class Engineer class Expert extends Engineer //如果是+T,指定類型為某類時,傳入其子類或其本身 //如果是-T,指定類型為某類時,傳入其父類或其本身
class Meeting[+T]//可以傳入T或T的子類

class Maximum[T:Ordering](val x:T,val y:T){ def bigger(implicit ord:Ordering[T])={ if(ord.compare(x, y)>0)x else y } } object HelloScalaTypeSystem { def main(args: Array[String]): Unit = { val p= new Person("Spark") val w= new Worker("Scala") new Club(p,w).comminicate //"<%"的列子 //只是提供了一個轉換的方法,在遇到<%時會調用看dog是否被轉換了。
     implicit def dog2Person(dog:Dog)=new Person(dog.name) val d = new Dog("dahuang") //注意必須強制類型轉換,implicit中雖然是將dog隱式轉換成person, //但是其實是對象擦除,變成了object,所以還要強制類型轉換成person后才能使用 //用[person]強制轉換
     new Club2[Person](p,d).comminicate //-T +T例子,下面的participateMeeting方法指定具體是什么泛型
     val p1=new Meeting[Engineer] val p2=new Meeting[Expert] participateMeeting(p1) participateMeeting(p2) // T:Ordering 的例子 
     println(new Maximum(3,5).bigger) println(new Maximum("Scala","Java").bigger) } //這里指定傳入的泛型具體是什么
  def participateMeeting(meeting:Meeting[Engineer])=  println("welcome") }

T:ClassTag的例子(根據輸入動態定義)

命令行代碼:

scala> import scala.reflect.ClassTag import scala.reflect.ClassTag scala> def mkArray[T: ClassTag](elems: T*) = Array[T](elems: _*) mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T] scala> mkArray(1,2,3) res1: Array[Int] = Array(1, 2, 3) scala> mkArray("ss","dd") res2: Array[String] = Array(ss, dd) scala> mkArray(1,"dd") res2: Array[Any] = Array(1, dd)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM