Я пробую складывать двух характерных в абстрактном классе, полученном в наследство от Number, но он не позволяет это мне, мне хотелось бы упорядочивать это
public abstract class MatrizGenerica<E extends Number> {
// Crear array genérico E[][] arrayGenerico = (E[][]) new Number[5][5];
protected abstract E sumar(E o1, E o2);
protected abstract E multiplicar(E o1, E o2);
protected abstract E cero();
public E[][] sumarMatrices(E[][] matriz1, E[][] matriz2){
if((matriz1.length != matriz2.length) && (matriz1[0].length != matriz2[0].length)) {
throw new RuntimeException("Las matrices no tienen el mismo tamaño");
}
//Crear array generico
E[][] genericArray = (E[][]) new Number[matriz1.length][matriz1[0].length];
for (int filas = 0; filas < matriz1.length; filas++) {
for (int columnas = 0; columnas < matriz1[filas].length; columnas++) {
genericArray[filas][columnas] = (matriz1[filas][columnas]).doubleValue() +
(matriz2[filas][columnas]).doubleValue();
//new Double(String.valueOf(o1))
}
}
return genericArray;
}
}
Они genГ©ricos Java есть у ограничений, asГ - который тебе показал cГіmo podrГ-эксперт заставлять это функционировать:
, Поскольку genГ©rico E
должен быть Number
или класс дочь, estГЎs ограниченный ими mГ©todos поставленные классом Number. Это значит, что ты не имеешь mГ©todos, чтобы делать операции с ними, если только ты они не преобразуешь сначала в nГєmeros примитивные (то, что уже ты делаешь с doubleValue()
).
Проблема - что не estГЎs создавая новый элемент типа Double, и autoboxing не ты funcionarГЎ, так как составитель не является таким умным, как чтобы знать, что тип E - Number, и что Double - Number. PodrГ-хозяева делать следующее:
genericArray[filas][columnas] = new Double(
(matriz1[filas][columnas]).doubleValue() +
(matriz2[filas][columnas]).doubleValue());
И compilarГ - в, но он будет давать тебе ошибку в ejecuciГіn каждый раз, когда matriz1
и matriz2
не было Double
, потому что результат должен быть того же класса, что два inputs. PodrГ-хозяева пробовать решать это asГ-:
public abstract class MatrizGenerica<E extends Number> {
//otros métodos abstractos que he eliminado por simplicidad
public E[][] sumarMatrices(E[][] matriz1, E[][] matriz2){
if((matriz1.length != matriz2.length) && (matriz1[0].length != matriz2[0].length)) {
throw new RuntimeException("Las matrices no tienen el mismo tamaño");
}
E n= matriz1[0][0];
Class<? extends Number> clazz=n.getClass();
E[][] genericArray = generaMatriz(clazz, matriz1.length, matriz1[0].length);
for (int filas = 0; filas < matriz1.length; filas++) {
for (int columnas = 0; columnas < matriz1[filas].length; columnas++) {
double suma= (matriz1[filas][columnas]).doubleValue() +
(matriz2[filas][columnas]).doubleValue();
genericArray[filas][columnas] = generaNumber(suma, clazz);
//new Double(String.valueOf(o1))
}
}
return genericArray;
}
@SuppressWarnings("unchecked")
private E generaNumber(double suma, Class<? extends Number> clazz) {
if (clazz == Double.class) {
return (E) new Double(suma);
}
if (clazz == Integer.class) {
return (E) new Integer((int) suma); //perderá decimales, si los hay
}
// ... otras opciones
return (E) new BigDecimal(suma);
}
@SuppressWarnings("unchecked")
private E[][] generaMatriz(Class c, int rows, int columns) {
Class<? extends Number[]> clazz= ((E[]) Array.newInstance(c,0)).getClass();
E[][] matrix = (E[][]) Array.newInstance(clazz, rows);
for (int i=0;i< matrix.length; i++) {
matrix[i] = (E[]) Array.newInstance(c, columns);
}
return matrix;
}
public static void main(String[] args) {
MatrizGenerica<Integer> mg = new MatrizGenerica<Integer>() {};
Integer[][] m1 = {{1,2},{1,2}};
Integer[][] m2 = {{1,2},{1,2}};
Integer[][] r = mg.sumarMatrices(m1,m2);
System.out.print(r[0][0]);
}
}
, Поскольку ты видишь, создавать объект с genГ©ricos - достаточно запутано: Что-то как
E[][] matriz = new E[n][m];
дает ошибку compilaciГіn, так как не возможно создавать array genГ©ricos.
Возвращать array Number, как ты пробуешь, также не функционирует, потому что ты возвращаешь тип disntinto в E, asГ - что я создал один mГ©todo, чтобы производить каждый элемент твоего массива и другой, чтобы производить сам массив, зная класс полученных массивов.