通用多维数组转换函数

时间:2013-08-07 15:48:49

标签: java arrays generics multidimensional-array

此函数将Collection的{​​{1}}转换为String的二维数组:

String

如何编写此函数以便一般性地执行此操作:

public static String[][] toArray(
                             Collection<? extends Collection<String>> values){

    String[][] result = new String[ values.size() ][];
    int i=0;
    for( Collection<String> row : values ){
        result[i] = row.toArray( new String[ row.size() ] );
        i++;
    }
    return result;
}

3 个答案:

答案 0 :(得分:2)

泛型和数组不混合。一种替代方法是传递表示Class的{​​{1}}实例,并使用它来创建返回数组(请参阅Array.newInstance())。我认为更好的方法是将X作为另一个参数传递,填充并返回:

X[][]

例如:

public static <X> X[][] toArray(Collection<? extends Collection<X>> values,
        X[][] result) {

    int i = 0;
    for (Collection<X> row : values)
        result[i] = row.toArray(result[i++]);

    return result;
}
[[1, 2, 3], [4, 5], [6]]

答案 1 :(得分:2)

我担心你不能。

  

这是因为Java的数组(与泛型不同)在运行时包含有关其组件类型的信息。因此,在创建阵列时必须知道组件类型。由于您不知道T在运行时是什么,因此无法创建数组

来源:https://stackoverflow.com/a/2931240newacct

答案 2 :(得分:0)

因为类型擦除所以不可能。但至少有一个解决方案:

public static <X> X[][] toArray( Class<X> xClass, 
        Collection<? extends Collection<X>> values ){

    @SuppressWarnings( "unchecked" )
    X[][] result = (X[][])Array.newInstance( xClass , values.size(), 0 );

    int i=0;
    for( Collection<X> row : values ){

        @SuppressWarnings( "unchecked" )
        X[] rowAsArray = (X[])Array.newInstance( xClass, row.size() );
        result[i] = row.toArray( rowAsArray );
        i++;
    }
    return result;
}

(感谢您指点我Array.newInstance