2011-03-16 8 views
15

¿Es posible hacer coincidir los tipos en Scala? Algo como esto:tipos coincidentes en 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!" 
    } 

(Pero que recopila, obviamente :))

O tal vez el enfoque correcto está sobrecargando tipo ... es posible?

No puedo pasarle una instancia de un objeto y coincidencia de patrón, desafortunadamente.

Respuesta

21

Puede usar manifiestos y hacer una coincidencia de patrón en ellos. Sin embargo, el caso al pasar una clase de matriz es problemático, ya que la JVM usa una clase diferente para cada tipo de matriz. Para solucionar este problema se puede comprobar si el tipo en cuestión se borra a una clase de matriz:

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' es más rápido, si el borrado es suficiente. –

+0

'Manifiesto' está en desuso. Verifique la respuesta: https://stackoverflow.com/a/46706940/1894198 –

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

No puedo pasarle una instancia del objeto. –

+2

Para pasar una instancia del objeto, reemplace el guión bajo antes de los dos puntos con un nombre de variable. Ej: 'case s: String =>" me diste String "+ s' –

+4

Quise decir que necesitaba llamarlo sin una instancia del objeto, por ejemplo' apply [String] ', en oposición a' apply (" cadena ")'. –

2

Manifest Identificación obsoleta. Pero se puede usar 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!" 
    } 
} 

Espero que esto ayude.

Cuestiones relacionadas