8
votes

Comment puis-je vérifier un objet pour voir son type et renvoyer un objet casted

J'ai une méthode sur laquelle je passe un objet. Dans cette méthode, je vérifie que c'est le type et en fonction du type que je fais quelque chose avec elle et de retourner longtemps. J'ai essayé toutes les quelles choses que je peux penser à faire cela et que je reçois toujours plusieurs erreurs de compilateur me disant que cela s'attend à un certain objet, mais obtient un autre. Quelqu'un peut-il vous expliquer ce que je fais mal et me guider dans la bonne direction? Ce que j'ai essayé jusqu'à présent est ci-dessous:

  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")        
          }
  }


0 commentaires

3 Réponses :


7
votes

Ce code pleure pour utiliser une correspondance:

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
}


3 commentaires

Bien sûr, le problème avec c'est que, avec le cas d'objet, il correspondra toujours. Il devrait être à la fin.


Cela ne compilera pas que Boolean n'est pas une sous-classe d'objet.


@RAHUL G: Cela ne serait pas diagnostiqué dans l'original mais manifeste dans ce cas, un signe que l'utilisation de fonctionnalités de Scala vous aident à expirer des erreurs de type.



2
votes

Ceci pourrait être un démarrage:

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 
}  


0 commentaires

38
votes

La correspondance des motifs rendrait beaucoup plus gentil. xxx


4 commentaires

Cela a fonctionné parfaitement, à l'exception de l'exception dans le cas booléen, j'ai eu une erreur de compilateur disant depuis longtemps. J'en ai pris soin de cela en la modifiant à si (b) 1.Longvalue ailleurs 0.LongValue


C'est un peu fou il n'y a pas d'implicite de Int à long. C'est toujours en sécurité de le faire.


@Russ: Ou vous pouvez écrire si (b) 1L autre 0L .


Si un type getInteger (3) , on obtient un objet ayant le type tout , comment l'obtenir comme entier?