Scala學習 泛型 T 的6種使用(初)

2022-09-01 09:36:16 字數 2097 閱讀 4499

1

package

com.dtspark.scala.basics23

/**4

* 1,scala的類和方法、函式都可以是泛型。5*

67* 2,關於對型別邊界的限定分為上邊界和下邊界(對類進行限制)

8* 上邊界:表達了泛型的型別必須是"某種型別"或某種型別的"子類",語法為「<:」,

9* 下邊界:表達了泛型的型別必須是"某種型別"或某種型別的"父類",語法為「>:」,

10*

1112

* 3, "<%" :view bounds可以進行某種神秘的轉換,把你的型別在沒有知覺的情況下轉換成目標型別,

13* 其實你可以認為view bounds是上下邊界的加強和補充,語法為:"<%",要用到implicit進行隱式轉換(見下面例子)

14*

1516

* 4,"t:classtag":相當於動態型別,你使用時傳入什麼型別就是什麼型別,(spark的程式的編譯和執行是區分了driver和executor的,只有在執行的時候才知道完整的型別資訊)

17* 語法為:"[t:classtag]"下面有列子18*

1920

* 5,逆變和協變:-t和+t(下面有具體例子)+t可以傳入其子類和本身(與繼承關係一至)-t可以傳入其父類和本身(與繼承的關係相反),

21*

2223

* 6,"t:ordering" :表示將t變成ordering[t],可以直接用其方法進行比大小,可完成排序等工作

24*/

2526

class

person(val name:string)30}

3132

class worker(name:string)extends

person(name)

3334

class

dog(val name:string)

3536

3738

39//

注意泛型用的是

40class club[t<:person](p1:t,p2:t)

4344

45class club2[t<%person](p1:t,p2:t)

4849

class

engineer

50class expert extends

engineer

51//

如果是+t,指定型別為某類時,傳入其子類或其本身

52//

如果是-t,指定型別為某類時,傳入其父類或其本身

53class meeting[+t]//

可以傳入t或t的子類

5455

class

maximum[t:ordering](val x:t,val y:t)59}

6061

object helloscalatypesystem

88//

這裡指定傳入的泛型具體是什麼

89 def participatemeeting(meeting:meeting[engineer])= println("welcome")

9091 }

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)

scala的泛型類

泛型類 scala的類也可以定義泛型。接下來,我們來學習如何定義scala的泛型類 定義 語法格式 class 類 t val 變數名 t 定義乙個泛型類,直接在類名後面加上方括號,指定要使用的泛型引數 指定類對應的泛型引數後,就使用這些型別引數來定義變數了 示例 示例說明 實現乙個pair泛型類 ...

Scala入門七 scala的泛型

a 上邊界 表達了泛型的型別必須是 某種型別 或某種型別的 子類 案例 override def toset b a set b a 下邊界 表達了泛型的型別必須是 某種型別 或某種型別的 父類 案例 override def toset b a set b a view bounds可以進行某種神...

泛型T的型別獲取

t.getclass 或者t.class都是非法的,因為t是泛型變數。由於乙個類的型別是什麼是在編譯期處理的,故不能在執行時直接在base裡得到t的實際型別。author joshua version 2011 12 15 下午02 27 43 可以在service層直接呼叫,也可以在dao層擴充套...