5

ジェネリック型配列のインスタンス化に問題があります。コードは次のとおりです。

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;
}
}

このメソッドが、クラスが Number のサブタイプである行列を転置し、指定された型で行列の転置を返すことができるようにしたいだけです。誰の助けも大歓迎です。ありがとう。

4

4 に答える 4

5

タイプは実行時に不明であるため、このように使用することはできません。代わりに、次のようなものにする必要があります。

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

注:ジェネリックはプリミティブにすることはできないため、使用することはできませんdouble[][]

ワンステップで割り当てることを提案してくれた@newacctに感謝します。

于 2012-09-05T14:15:13.733 に答える
5

java.lang.reflect.Array特定のタイプの配列を動的にインスタンス化するために使用できます。次のように、必要なタイプの Class オブジェクトを渡すだけです。

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);  
}
于 2012-09-05T14:16:59.333 に答える
2

これを使用して、両方のディメンションを一度に作成できます。

    // 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);
于 2012-09-05T14:20:12.860 に答える
0

コンポーネントタイプがワイルドカードパラメータ化タイプである配列を作成できますか?を参照してください。コンポーネントタイプが具体的なパラメーター化されたタイプである配列を作成できますか? なぜこれができないのかについての詳細な説明については、GenericsFAQから。

于 2012-09-05T14:14:17.953 に答える