Je veux créer une méthode qui compare un nombre mais peut avoir une entrée de l'une quelconque des sous-classes du nombre.
J'ai cherché à faire cela de la manière suivante ... P>
public static <T extends Number> void evaluate(T inputNumber) { if (inputNumber >= x) { ... } }
6 Réponses :
Dans ce cas, vous pouvez utiliser une méthode ordinaire sans génériques p>
Donc, si la méthode est d'accepter un double ou un entier, j'aurais alors besoin de deux méthodes avec des signatures différentes ou que je manque quelque chose?
@MR_R: Si vous utilisez Java 5, l'autoboxing convertira-t-on entier et entier qui implémente le numéro d'application.
Profitez du polymorphisme et offrez simplement un évaluer (numéro) code> méthode
Le numéro Une solution consiste à "plier" les valeurs en deux types: Notez que cela ne fonctionne que pour les types de numéro standard, mais Si vous souhaitez prendre en charge tous les types, une astuce consiste à utiliser qui devrait toujours fonctionner et vous donner le résultat le plus précis. p> p> code> API n'offre pas de manière propre pour obtenir la valeur; Vous devez utiliser
instanceof code>.
long code> et
double code>. De cette façon, vous pouvez utiliser ce code: p>
numéro code> est également mis en œuvre par beaucoup de Autres types (
atomicinteger code>,
bigdecimal code>). p>
BigDecimal code> : p>
Méthodes avec
instance de code> pour chaque enfant de numéro et traitez ce cas en casting au sous-type. Ou (mieux je pense - c'est la façon dont le soleil le fait) est de simplement avoir une méthode pour chaque type enfant, en profitant éventuellement de la boxe / de la boîteboxing pour les opérateurs tels que +, -,> etc., où cela est possible (tous les emballages, non pour biginteger / bigdecimal ou tout type personnalisé). p>
Malheureusement, il n'est pas moyen d'obtenir le type primitif du type wrapper sans recourir à des blocs if / sinon.
Le problème est qu'il ne serait tout simplement pas possible de mettre en œuvre une telle méthode de manière générique. Voici quelques approches apparemment possibles que l'on pourrait s'attendre à trouver dans la classe de nombres: p> Ce serait bien, n'est-ce pas? Mais il est impossible. Il n'y a pas de x possible qui pourrait être une abstraction sur Cela ne vous aidera pas non plus, car il n'ya aucun moyen d'instantiier les classes primitives. P> Donc, la seule chose que vous pouvez faire est courante à tous les types consiste à utiliser le Donc: la hiérarchie du numéro Java est juste non adapté pour résoudre de tels problèmes de manière générique. p> p> int code>,
float code>,
double code> etc. p>
longvalue ( ) code> ou
doublevalue () code> méthodes, mais de toute façon, vous perdez des informations si vous traitez du mauvais type. P>
S'il s'agit vraiment de comparer l'argument à une autre valeur du même paramètre de type, vous pouvez effectuer ce qui suit (il suffit d'ajouter dans t x code> pour la simplicité)
Il y a toujours une option pour travailler avec des données inconnues avec des interfaces de motif. C'est à quelle vitesse fonctionne avec l'interface de comparaison. Vous devez créer et ajouter un paramètre de méthode Evaluateur d'interface fonctionnelle avec une méthode d'évaluation (numéro T) et déterminer la logique d'évaluation hors de la méthode. Vous pouvez également créer quelques exemples à partir de classes d'assistance, telles que les évaluateurs :: INTEGEREVALUATOR qui fonctionnera pour les entiers et les suggérons au client. Sry pour mon eng p>
Connexes: Java: méthodes génériques et chiffres .