¿Hay una técnica frecuente para resumir los elementos de una matriz que tiene tipo genérico, pero se limita al número?

MakeBugsNotWar:

He creado una matriz de tipo genérico delimitada con número. He creado un método para resumir todos sus elementos.
Aquí está el código

class GenericMethod {
    public static void main(String[] args) {
        Integer[] arr = {10, 20, 30, 40, 50};
        int sum = GenericMethod.<Integer>sumOfAllElements(arr);
        System.out.println(sum);
        Float[] floats = {3.0f, 4.19f};
        int sum2 = GenericMethod.<Float>sum(floats);
        System.out.println(sum2);
    }

    public static <T extends Number> int sumOfAllElements(T[] arr) {
        int response = 0;
        for (T t : arr) {
            response += t.intValue();
        }
        return response;
    }
}

En el procedimiento, el tipo de retorno es todavía una int. Me gustaría cambiar el tipo de retorno a un genérico también.

  • He intentado declarar la responsevariable con el tipo genérico N, pero entonces no puedo inicializar con 0o incluso con la Integerclase de contenedor
    N result = Integer.valueOf(0);
    que en un principio pensé que podría ser posible ya que la Integerclase extendida la Numberclase.
  • Luego he intentado inicializar como null
    N result = null;
    pero luego esta línea,
    result = result + array[i].intValue();
    arroja un error que indica Operator + cannot be applied to N, int. No puedo cambiar a la línea
    result = result + array[i];
    porque entonces se muestra Operator + cannot be applied to N, N.
  • También he intentado esto "Hack"
public static <N extends Number> N sum(N[] array) {
        Number result = array[0];
        if (result instanceof Integer) {
            Integer temp = result.intValue();
            for (int i = 0; i < array.length; i++) {
                temp += array[i].intValue();
            }
            result = temp;
        }
        return (N) result;
    }

pero entonces tendría que especificar los casos de todos los tipos de número.
Podría alguien por favor me ayude con, - modificación de este método, por lo que podría devolver un tipo genérico en lugar de int. - ayuda a entender la naturaleza y la causa de este problema, es que debido a que la clase sigue siendo un tipo no genérico?

Elliott fresca:

El más simple método, si el uso de Java 8+, sería utilizar Arrays.stream(T[])para crear una corriente de T(s) y luego reduceesa corriente con la adición. Me gusta,

Integer[] arr = { 10, 20, 30, 40, 50 };
Float[] floats = { 3.0f, 4.19f };
System.out.println(Arrays.stream(arr).reduce((a, b) -> a + b));
System.out.println(Arrays.stream(floats).reduce((a, b) -> a + b));

No se requieren métodos adicionales. Pero , si usted quiere hacer que un método, se puede pasar a la operación como

public static <T> T add(T[] arr, BinaryOperator<T> op) {
    return Arrays.stream(arr).reduce(op).get();
}

y luego llamar así

System.out.println(add(arr, (a, b) -> a + b));

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=312850&siteId=1
Recomendado
Clasificación