2011-03-16 101 views
15

是否可以匹配Scala中的類型?事情是這樣的:scala中的匹配類型

def apply[T] = T match { 
    case String => "you gave me a String", 
    case Array => "you gave me an Array" 
    case _ => "I don't know what type that is!" 
    } 

(但是,編譯,顯然:))

或許是正確的做法是類型超載......這可能嗎?

不幸的是,我不能通過它的一個對象的實例和模式匹配。

回答

21

您可以使用清單並對它們進行模式匹配。但是,傳遞數組類時的情況有問題,因爲JVM對每種數組類型使用不同的類。要解決此問題,您可以檢查,如果有問題的類型被刪除到數組類:棄用

val StringManifest = manifest[String] 

def apply[T : Manifest] = manifest[T] match { 
    case StringManifest => "you gave me a String" 
    case x if x.erasure.isArray => "you gave me an Array" 
    case _ => "I don't know what type that is!" 
} 
+3

如果刪除足夠,'ClassManifest'會更快。 – 2011-03-16 23:12:49

+0

'Manifest'已棄用。檢查答案:https://stackoverflow.com/a/46706940/1894198 – 2018-01-03 13:56:59

17
def apply[T](t: T) = t match { 
    case _: String => "you gave me a String" 
    case _: Array[_] => "you gave me an Array" 
    case _ => "I don't know what type that is!" 
} 
+1

我無法將它傳遞給對象的一個​​實例。 – 2011-03-16 20:22:07

+2

要傳遞對象的實例,請將冒號前面的下劃線替換爲變量名稱。例如:'case s:String =>「你給了我一個字符串」+ s' – 2011-03-16 20:26:22

+4

我的意思是我需要在沒有對象實例的情況下調用它,例如'apply [String]',而不是'apply(「字符串「)'。 – 2011-03-16 20:42:45

2

Manifest ID。但你可以使用TypeTag

import scala.reflect.runtime.universe._ 

def fn[R](r: R)(implicit tag: TypeTag[R]) { 

    typeOf(tag) match { 
     case t if t =:= typeOf[String] => "you gave me a String" 
     case t if t =:= typeOf[Array[_]] => "you gave me an Array" 
     case _ => "I don't know what type that is!" 
    } 
} 

希望這會有所幫助。