5 votes

Comment puis-je instancier un type de tableau générique en java ?

J'ai un problème avec l'instanciation d'un tableau de type générique, voici mon code :

public final class MatrixOperations<T extends Number>
{
    /**
 * <p>This method gets the transpose of any matrix passed in to it as argument</p>
 * @param matrix This is the matrix to be transposed
 * @param rows  The number of rows in this matrix
 * @param cols  The number of columns in this matrix
 * @return The transpose of the matrix
 */
public T[][] getTranspose(T[][] matrix, int rows, int cols)
{
    T[][] transpose = new T[rows][cols];//Error: generic array creation
    for(int x = 0; x < cols; x++)
    {
        for(int y = 0; y < rows; y++)
        {
            transpose[x][y] = matrix[y][x];
        }
    }
    return transpose;
}
}

Je veux juste que cette méthode soit capable de transposer une matrice dont la classe est un sous-type de Number et de retourner la transposition de la matrice dans le type spécifié. L'aide de quiconque serait très appréciée. Merci.

5voto

Peter Lawrey Points 229686

Le type n'est pas connu au moment de l'exécution, donc vous ne pouvez pas l'utiliser de cette façon. Au lieu de cela, vous devez faire quelque chose comme.

Class type = matrix.getClass().getComponentType().getComponentType();
T[][] transpose = (T[][]) Array.newInstance(type, rows, cols);

Note : les génériques ne peuvent pas être des primitives, vous ne pourrez donc pas utiliser double[][]

Merci à @newacct d'avoir suggéré d'allouer en une seule étape.

5voto

Shivan Dragon Points 8626

Vous pouvez utiliser java.lang.reflect.Array pour instancier dynamiquement un tableau d'un type donné. Il suffit de passer l'objet Class du type souhaité, comme ceci :

public T[][] getTranspose(Class<T> arrayType, T[][] matrix, int rows, int cols)
{

    T[][] transpose = (T[][]) Array.newInstance(arrayType, rows,cols);
    for (int x = 0; x < cols; x++)
    {
        for (int y = 0; y < rows; y++)
        {
            transpose[x][y] = matrix[y][x];
        }
    }
    return transpose;
}

public static void main(String args[]) {
    MatrixOperations<Integer> mo = new MatrixOperations<>();
    Integer[][] i = mo.getTranspose(Integer.class, new Integer[2][2], 2, 2);
    i[1][1] = new Integer(13);  
}

2voto

Joachim Sauer Points 133411

Vous pouvez l'utiliser pour créer les deux dimensions en même temps :

    // this is really a Class<? extends T> but the compiler can't verify that ...
    final Class<?> tClass = matrix.getClass().getComponentType().getComponentType();
    // ... so this contains an unchecked cast.
    @SuppressWarnings("unchecked")
    T[][] transpose = (T[][]) Array.newInstance(tClass, cols, rows);

0voto

matt b Points 73770

Voir Puis-je créer un tableau dont le type de composant est un type paramétré joker ? y Puis-je créer un tableau dont le type de composant est un type paramétré concret ? de la FAQ sur les produits génériques pour une explication détaillée de la raison pour laquelle vous ne pouvez pas faire cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X