En Java, Comment puis-je retourner une Chaîne de caractères ou un double en fonction de la circonstance de la méthode? Est-il possible?
Par exemple, j'ai une méthode qui ressemble à travers une chaîne de données séparées par un séparateur, mais certains éléments peuvent être des noms, et d'autres éléments peuvent être des nombres.
Si un utilisateur appelle ma méthode pour retourner l'article X de la deliminated liste, je veux le retour d'une chaîne de caractères si l'élément X est un nom, ou un double si l'élément X est un nombre.
Par exemple, objectName.get(5);
serait d'obtenir le 5ème élément dans la deliminated liste.
Aurais-je à utiliser un certain type de surcharge pour cela?
Ou devrais-je plutôt faire quelque chose comme objectName.getDouble(5);
et objectName.getString(5);
basée sur le fait que l'utilisateur sait à quel point 5 est?
Mais que faire si l'utilisateur ne sait pas ce que l'élément 5 est? Il a juste besoin d'une Chaîne ou d'un lit Double en fonction de ce qu'il se passe à.
OriginalL'auteur trusktr | 2010-10-16
Vous devez vous connecter pour publier un commentaire.
Voici une façon de le faire:
Notez qu'il sera de retour un
Double
wrapper plutôt qu'undouble
.Je ne pense pas que ce soit une bonne idée, mais, depuis l'appelant a maintenant pour tester le type de la valeur retournée et faire un transtypage de faire quelque chose avec elle.
Pour l'enregistrement, Java ne permet pas une méthode pour renvoyer une
String
oudouble
parce que ces types n'ont pas de commune supertype dans le système de type Java.Si votre type de retour est un Objet, vous pouvez retourner quelque chose à partir de cette méthode qui hérite de l'Objet de la classe de base. Le problème est que l'appelant ne savez pas quel type que vous avez retourné, de sorte que l'appelant devra faire la vérification du type et d'un plâtre pour obtenir quelque chose d'utile à partir de la valeur de retour. Il n'y a rien de mal à cela, mais il s'agit probablement d'une manière plus propre de le faire.
Pas de. Je veux dire que si le code qui permet d'obtenir la valeur doit faire quelque chose avec elle qui dépend de son type, puis tapez le jeter. Évidemment, certaines choses ne dépendent pas de l'objet renvoyé est de type; par exemple, l'affectation à un autre
Object
variable, ou en appelant letoString()
.J'ai aussi "miss" de l'exécution de PHP surprises dans les applications complexes 🙂
sans unbox ne fonctionne pas ici sans transtypage. Donc
double d = (Double) x.get();
. Et bien sûr, le transtypage peut lancer une décoché exception.OriginalL'auteur Stephen C
Pour ce genre de chose, je préfère utiliser quelque chose qui ressemble à de la Peut-être/l'Option motif de la programmation fonctionnelle camp. Vous vous retrouvez avec une interface comme:
Cela force le problème pour les clients, dans qui il y a toujours un test de cohérence qu'il y a en effet une double ou une Chaîne au moment opportun. Dans votre cas, je ferais juste une méthode get (), de sorte que lorsque le client (pense) sait ce que le type est, l'appel est
et dans votre get(int) de la méthode, plutôt que de retourner une Chaîne de caractères ou un lit double, l'instruction return ressemble
C'est un peu de travail supplémentaire à l'avant, mais il a payé pour moi à plusieurs reprises dans le passé.
Voici comment vous pouvez l'utiliser pour construire un (avertissement - ce qui n'a pas été à proximité d'un compilateur)
et voici ce que le client ressemble
J'avais pense que vous seriez obtenir beaucoup plus hors de lui si vous avez essayé pour la compiler, puis joué avec un débogueur. Qui peu voulez-vous expliqué? Il n'y a pas beaucoup plus de contexte de votre question pour exposer sur.
C'est une astuce. Je me souviens de celui-là.
Je suppose que je ne connais pas assez bien le Java encore à même de savoir quelles questions poser hehe. J'ai fait la JAVA que pour 4 semaines. Je vais certainement garder cela à portée de main. Pour l'instant, j'ai juste sorti des Chaînes et de laisser le client se convertir à double s'il le souhaite.
Burleigh Ours, je n'ai jamais eu la chance de l'essayer... je suis sûr que je sais même pas comment utiliser la classe. Pouvez-vous poster un exemple d'utilisation?
OriginalL'auteur Burleigh Bear
Si vous avez besoin de faire cela, alors il ya un problème avec votre conception. Depuis l'origine de la source de données est une Chaîne, vous devez accepter que toutes les valeurs renvoyées seront chaîne et de laisser le soin au client de vérifier si le résultat peut être convertie en nombre.
Si vous souhaitez enregistrer le client d'effectuer la vérification, vous pouvez lui fournir un minimum d'API qui peut ressembler à quelque chose comme:
OriginalL'auteur cherouvim
Le langage Java ne pas exposer à une surcharge sur le type de retour d'une méthode. (Thilo a souligné, c'est une restriction du langage Java et de ne pas la JVM/bytecode.)
Généralement ce genre de chose ne rentre pas bien dans la Java type de système. On peut imaginer le retour d'un
Either<String,Double>
type (plus restreinte type de retour queObject
comme suggéré par Stephen C et un type plus général que DoubleOrString comme l'a souligné B. Ours), mais en général l'effort requis pour l'utilisation d'une telle construction en Java entraîne généralement simplement le fait d'avoir plusieurs méthodes, par exemple,getString(...)
etgetDouble(...)
.Comment fonctionne exactement que Soit le type de travail?
c'est hypothétique.
Oh, gotcha. (foobar)
"Le langage Java ne pas exposer à une surcharge sur le type de retour d'une méthode." La JVM cependant, prend en charge cette fonctionnalité.
OriginalL'auteur