11
votes

Java Generics et la classe de nombres

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 :


0
votes

Dans ce cas, vous pouvez utiliser une méthode ordinaire sans génériques


3 commentaires

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) méthode



9
votes

Le numéro API n'offre pas de manière propre pour obtenir la valeur; Vous devez utiliser instanceof .

Une solution consiste à "plier" les valeurs en deux types: long et double . De cette façon, vous pouvez utiliser ce code: xxx

Notez que cela ne fonctionne que pour les types de numéro standard, mais numéro est également mis en œuvre par beaucoup de Autres types ( atomicinteger , bigdecimal ).

Si vous souhaitez prendre en charge tous les types, une astuce consiste à utiliser BigDecimal : xxx

qui devrait toujours fonctionner et vous donner le résultat le plus précis.


0 commentaires

2
votes

Méthodes avec sont toujours des problèmes, car vous ne pouvez rien faire sur un nombre (tous les opérateurs sont définis pour les enfants). Vous auriez besoin de faire une tonne de instance de 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é).


0 commentaires

5
votes

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: xxx

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 int , float , double etc. xxx

Cela ne vous aidera pas non plus, car il n'ya aucun moyen d'instantiier les classes primitives.

Donc, la seule chose que vous pouvez faire est courante à tous les types consiste à utiliser le longvalue ( ) ou doublevalue () méthodes, mais de toute façon, vous perdez des informations si vous traitez du mauvais type.

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.


0 commentaires

2
votes

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 pour la simplicité) xxx < / p>


0 commentaires

0
votes

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


0 commentaires