2

此函数将s 的二维数组转换Collection为sString的二维数组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;
}

为了一般地执行此操作,如何编写此函数:

public static <X> X[][] ArrayArray(Collection<? extends Collection<X>> values){
    // ?
}
4

3 回答 3

2

泛型和数组不能混用。一种替代方法是传递一个表示并使用它来创建返回数组的Class实例(请参阅 参考资料)。我相信更好的方法是将in 作为另一个参数传递,填充它并返回它:XArray.newInstance()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;
}

例如:

List<List<Integer>> l = Arrays.asList(Arrays.asList(1,2,3), 
                                      Arrays.asList(4,5),
                                      Arrays.asList(6));

System.out.println(Arrays.deepToString(toArray(l, new Integer[l.size()][0])));
[[1, 2, 3], [4, 5], [6]]
于 2013-08-07T15:53:05.497 回答
2

恐怕你不能。

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

资料来源:https ://stackoverflow.com/a/2931240 ,由newacct

于 2013-08-07T15:56:53.390 回答
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

于 2013-08-07T16:41:06.103 回答