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
response
variável com o tipo genéricoN
, mas então eu não pode inicializar-lo com0
ou mesmo com aInteger
classe wrapper
N result = Integer.valueOf(0);
, que inicialmente eu pensei que poderia ser possível uma vez que aInteger
classe estendida daNumber
classe. - Então eu tentei inicializar-lo como
null
N result = null;
, mas depois desta linha,
result = result + array[i].intValue();
lança um erro informandoOperator + cannot be applied to N, int
. Eu não posso mudar a linha para
result = result + array[i];
porque então ele mostraOperator + 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?
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, reduce
esse 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));