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
response
variable con el tipo genéricoN
, pero entonces no puedo inicializar con0
o incluso con laInteger
clase de contenedor
N result = Integer.valueOf(0);
que en un principio pensé que podría ser posible ya que laInteger
clase extendida laNumber
clase. - Luego he intentado inicializar como
null
N result = null;
pero luego esta línea,
result = result + array[i].intValue();
arroja un error que indicaOperator + cannot be applied to N, int
. No puedo cambiar a la línea
result = result + array[i];
porque entonces se muestraOperator + 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?
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 reduce
esa 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));