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") } }
3 Réponses :
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 }
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.
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 }
La correspondance des motifs rendrait beaucoup plus gentil.
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 code>
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 code>.
Si un type getInteger (3) code>, on obtient un objet ayant le type
tout code>, comment l'obtenir comme entier?