2010-04-17 5 views
8

J'ai une méthode à laquelle je passe un objet. Dans cette méthode je vérifie son type et en fonction du type je fais quelque chose avec lui et retourne un long. J'ai essayé de toutes les manières possibles de faire cela et j'ai toujours plusieurs erreurs de compilateur me disant qu'il attend un certain objet mais en obtient un autre. Quelqu'un peut-il m'expliquer ce que je fais de mal et me guider dans la bonne direction? Ce que j'ai essayé jusqu'ici est ci-dessous:Comment puis-je vérifier un objet pour voir son type et retourner un objet moulé

override def getInteger(obj:Object) = { 
    if (obj.isInstanceOf[Object]) null 
    else if (obj.isInstanceOf[Number]) 
     (obj:Number).longValue() 
    else if (obj.isInstanceOf[Boolean]) 
     if (obj:Boolean) 1 else 0 
    else if (obj.isInstanceOf[String]) 
     if ((obj:String).length == 0 | (obj:String) == "null") 
     null 
     else 
      try { 
      Long.parse(obj:String) 
      } catch { 
      case e: Exception => throw new ValueConverterException("value \"" + obj.toString() + "\" of type " + obj.getClass().getName() + " is not convertible to Long")   
      } 
    } 

Répondre

36

La correspondance de motif le rendrait beaucoup plus agréable.

+0

cela a fonctionné parfaitement, à l'exception que dans le cas booléen, j'ai eu une erreur de compilateur en disant qu'une longue était attendue. Je m'en suis occupé en le modifiant en 'if (b) 1.longValue else 0.longValue' –

+3

C'est un peu fou, il n'y a pas d'implicite de int à long. C'est TOUJOURS sûr de le faire. – davetron5000

+7

@Russ: Ou vous pourriez écrire 'if (b) 1L else 0L'. – missingfaktor

6

Ce code crie pour l'utilisation d'un match:

obj match { 
    case n: Number => n.longValue 
    case b: Boolean => if (b) 1 else 0 
    case s: String => if ((s eq null) || s.length == 0) null else { 
      // try ... catch ... etc. 
      } 
    case o: Object => null 
} 

suivi mes propres conseils de mon commentaire à ma réponse originale ...

+0

Bien sûr, le problème avec ceci est qu'avec le cas d'objet d'abord, il correspondra toujours. Cela devrait être à la fin. –

+0

Cela ne compilera pas car Boolean n'est pas une sous-classe de Object. – missingfaktor

+1

@Rahul G: Ce ne serait pas diagnostiqué dans l'original mais manifeste dans ce cas, un signe que l'utilisation des fonctionnalités de Scala vous aide à effacer les erreurs de type. –

2

Cela pourrait être un début:

def getInteger (o : Any) : Long = o match { 
    case (o: Boolean) => if (o) 1 else 0  
    case (l: Long) => l       
    case (s: String) => java.lang.Long.parseLong (s) 
    case _ => 0L 
} 

(je n'ai pas quelque chose à passer outre, et Ignoré try/catch par souci de concision)

Questions connexes