Existe uma técnica prevalente para somar os elementos de uma matriz tendo tipo genérico, mas limitado a número?

MakeBugsNotWar:

Eu criei uma matriz de tipo genérico delimitada com número. Eu criei um método para resumir todos os seus elementos.
Aqui está o 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;
    }
}

No método, o tipo de retorno ainda é um int. Eu gostaria de mudar o tipo de retorno para um genérico também.

  • Eu tentei declarar a responsevariável com o tipo genérico N, mas então eu não pode inicializar-lo com 0ou mesmo com a Integerclasse wrapper
    N result = Integer.valueOf(0);
    , que inicialmente eu pensei que poderia ser possível uma vez que a Integerclasse estendida da Numberclasse.
  • Então eu tentei inicializar-lo como null
    N result = null;
    , mas depois desta linha,
    result = result + array[i].intValue();
    lança um erro informando Operator + cannot be applied to N, int. Eu não posso mudar a linha para
    result = result + array[i];
    porque então ele mostra Operator + cannot be applied to N, N.
  • Eu também tentei este "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;
    }

mas então eu teria que especificar os casos para todos os tipos de números.
Poderia alguém por favor me ajude com, - modificar este método, para que pudesse retornar um tipo genérico em vez de int. - ajuda-me a compreender a natureza ea causa deste problema, é porque a classe ainda é um tipo não-genérico?

Elliott fresco:

O mais simples método, se estiver usando Java 8+, seria usar Arrays.stream(T[])para criar um fluxo de T(s) e, em seguida, reduceesse fluxo com adição. Gostar,

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));

Sem métodos adicionais necessários. Mas , se você quiser fazer que um método, você poderia passar a operação como

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

e, em seguida, chamá-lo assim

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

Acho que você gosta

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