Matriz bidimensional, tipos genéricos e utilizar reflexão para criar uma nova instância da matriz

3 respostas
Dieval_Guizelini

Senhores,

tenho uma classe matriz declarada desta forma:

public class Matriz<E extends java.lang.Number> {
    private E[][] elementos;
    private int numLinhas;
    private int numColunas;
    
    public Matriz(int linhas, int colunas) {
        this.numLinhas = linhas;
        this.numColunas = colunas;
    }
//....
}
Eu estou precisando de um código para fazer a criação da matriz conforme o tipo do parâmetro, algo parecido com isso:
elementos = new E[linhas][colunas];
Usando reflexão eu consigo para matrizes de uma dimensão, exemplo:
Class<E> clazz;
        elementos = (E[])java.lang.reflect.Array.newInstance(clazz, linhas*colunas);

Mas não para duas ou mais, alguém tem alguma sugestão?

vw

3 Respostas

O

elementos = (E[][]) java.lang.reflect.Array.newInstance(elementos.getClass(), new int[]{linhas, colunas});

T

Completando a resposta do Ozix (que está correta!), vamos dar um exemplo:

import java.lang.reflect.Array;

class Cliente {
    public String nome;
	public double saldo;
}

class ArrayBidimensional {
	public&lt;T&gt; T[][] alocarArray (Class&lt;T&gt; klass, int linhas, int colunas) {
	    @SuppressWarnings("unchecked") T[][] ret = (T[][]) Array.newInstance (klass, linhas, colunas);
		return ret;
	}

    public static void main(String[] args) {
		Cliente[][] clientes = (new ArrayBidimensional()).alocarArray(Cliente.class, 10, 20);
		System.out.println (clientes.getClass().getSimpleName()); // Imprime "Cliente[][]"
		System.out.println (clientes.length); // número de linhas
		System.out.println (clientes.length &gt; 0 ? clientes[0].length : 0); // número de colunas
	}
}
sergiotaborda
Dieval Guizelini:
Senhores,

tenho uma classe matriz declarada desta forma:

public class Matriz<E extends java.lang.Number> {
    private E[][] elementos;
    private int numLinhas;
    private int numColunas;
    
    public Matriz(int linhas, int colunas) {
        this.numLinhas = linhas;
        this.numColunas = colunas;
    }
//....
}
Eu estou precisando de um código para fazer a criação da matriz conforme o tipo do parâmetro, algo parecido com isso:
elementos = new E[linhas][colunas];
Usando reflexão eu consigo para matrizes de uma dimensão, exemplo:
Class<E> clazz;
        elementos = (E[])java.lang.reflect.Array.newInstance(clazz, linhas*colunas);

Mas não para duas ou mais, alguém tem alguma sugestão?

Simplesmente não use arrays bidimensionais. Lembre-se que em java arrays n-dimensionais são arrays dee arrays de arrays ... Para matriz de duas dimensões é simples usar um só array. Ai a copia se torna trivial.

Criado 26 de março de 2008
Ultima resposta 26 de mar. de 2008
Respostas 3
Participantes 4