Génériques Java et additionner des nombres

Je voudrais append génériquement des nombres en java. Je rencontre des difficultés car la classe de nombres ne prend pas vraiment en charge ce que je veux faire. Ce que j’ai essayé jusqu’ici est ceci:

public class Summer { public E sumValue(List objectsToSum) { E total = (E) new Object(); for (E number : objectsToSum){ total += number; } return null; } 

Évidemment cela ne fonctionnera pas. Comment puis-je corriger ce code afin de pouvoir me donner une liste de ou ou peu importe et de renvoyer la sum?

Pour calculer une sum de manière générique, vous devez fournir deux actions:

  • Un moyen de ne rien rappend
  • Une façon de résumer deux éléments

En Java, vous le faites via une interface. Voici un exemple complet:

 import java.util.*; interface adder { T zero(); // Adding zero items T add(T lhs, T rhs); // Adding two items } class CalcSum { // This is your method; it takes an adder now public T sumValue(List list, adder adder) { T total = adder.zero(); for (T n : list){ total = adder.add(total, n); } return total; } } public class sum { public static void main(Ssortingng[] args) { List list = new ArrayList(); list.add(1); list.add(2); list.add(4); list.add(8); CalcSum calc = new CalcSum(); // This is how you supply an implementation for integers // through an anonymous implementation of an interface: Integer total = calc.sumValue(list, new adder() { public Integer add(Integer a, Integer b) { return a+b; } public Integer zero() { return 0; } }); System.out.println(total); } } 

Comme la classe Number n’expose pas d’interface pour effectuer des calculs, la seule façon de résoudre ce problème consiste à créer des classes qui encapsulent les opérations requirejses pour chaque type numérique pris en charge. Que dans votre classe, vous devrez utiliser un type spécifique.

Number ne prend en charge aucune opération, vous devez donc convertir les valeurs en types requirejs. Par exemple, si Number est un BigDecimal, il n’y a pas d’opérateur += .

Le nombre a intValue (), floatValue (), doubleValue (), longValue et shortValue (). Choisissez-en un et utilisez-le. Par exemple,

 double total; total += number.doubleValue(); return total; 

En outre, les génériques java ne sont en aucun cas équivalents aux modèles c ++. Vous ne pouvez pas allouer de nouvelles instances d’un type générique java. Cela ne peut jamais fonctionner:

 E hoot = (E) new Object(); 

Enfin, long , short , int , double et float ne sont pas des types de classe; ce sont des types primitifs. En tant que tels, ils ne sont pas disponibles pour une utilisation avec les génériques Java.

Vous devez vérifier le type d’exécution (par exemple, en utilisant instanceof ) et transtyper vers le type connu et effectuer l’opération d’addition appropriée. Vous ne savez pas quel sera le type de résultat, en tenant compte du fait que la liste peut contenir beaucoup de types de nombres différents.