Суммировать Характерные

Я пробую складывать двух характерных в абстрактном классе, полученном в наследство от 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;
    }
}
2
задан 19.03.2019, 11:37
1 ответ

Они 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, чтобы производить каждый элемент твоего массива и другой, чтобы производить сам массив, зная класс полученных массивов.

4
ответ дан 02.12.2019, 05:28